在浏览器输入存在的网址的一个交互过程

1.用户通过浏览器发送一个http的请求到指定的主机

2.服务器接收到该请求,对该请求进行分析和处理

3.服务器处理完成以后,返回对应的数据到用户机器

4.浏览器接收服务器返回的数据,并根据接收到的进行分析和处理

由客户端发送一个http请求到指定的服务端 -> 服务端接收并处理请求 -> 返回数据到客户端

Node.js 创建第一个应用 

如果我们使用 PHP 来编写后端的代码时,需要 Apache 或者 Nginx 的 HTTP 服务器, 来处理客户端的请求相应。不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时, 我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器。

第一步:直接创建一个app.js文件,然后引入http模块

第二步:创建服务器 ,使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。函数通过 request, response 参数来接收和响应数据。

var http = require('http');

http.createServer(function (request, response) {

  // 发送 HTTP 头部   // HTTP 状态值: 200 : OK //设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8
response.writeHead(200,{
"Content-Type": "text/html;charset=UTF-8"
}); // 发送响应数据 "Hello World"
response.end("哈哈哈哈,我买了一个 iPhone" + (1+2+3) + "s"); }).listen(8888); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8888/');

第三步:运行程序 并且浏览器运行

会发现,我们本地写一个 js,打死都不能直接拖入浏览器运行,但是有了 node,我 们任何一个 js 文件,都可以通过 node 来运行。也就是说,node 就是一个 js 的执行环境

http模块详解

引入http模块:搭建一个http的服务器,用于处理用户发送的http请求,需要使用node提供一个模块 http

var http = require('http');

创建服务器对象方法:创建并返回一个HTTP服务器对象,requestListener : 监听到客户端连接的回调函数

var server = http.createServer([requestListener]);

监听客户端请求:监听客户端连接请求,只有当调用了listen方法以后,服务器才开始工作

server.listen(port, [hostname], [backlog], [callback]);
// port : 监听的端口 ,不指定端口号,系统会自动分配一个;
// hostname : 主机名(IP/域名);
// backlog : 连接等待队列的最大长度;
// callback : 调用listen方法并成功开启监听以后,会触发一个listening事件,callback将作为该事件的执行函数

listening事件:当server调用listen方法并成功开始监听以后触发的事件

server.on('listening', function() {
console.log('listening...');
})

error事件:当服务开启失败的时候触发的事件,参数err : 具体的错误对象

server.on('error', function(err){
console.log(err);
});

request事件: 当有客户端发送请求到该主机和端口的请求的时候触发.

参数request : http.IncomingMessage的一个实例,通过他我们可以获取到这次请求的一些信息,比如头信息,数据等;

server.on("request",function (req,res) {
console.log('有客户端请求了........'); console.log(req.headers); // 请求头信息中的数据
console.log(req.httpVersion); // 使用的http协议版本
console.log(req.url); // 请求地址,这个地址指的是域名后面的地址(路由)
console.log(req.method); // 请求方式
})

参数response : http.ServerResponse的一个实例,通过他我们可以向该次请求的客户端输出返回响应

server.on("request",function (req,res) {
console.log('有客户端请求了........'); // 设置返回头信息,独立进行头部信息设置,对发送的数据不会产生任何的影响
res.setHeader('miaov', 'leo'); // writeHead(statusCode, [reasonPhrase], [headers]): 这个方法只能在当前请求中使用一次,并且必须在response.end()之前调用
// 第一个参数:是状态码,用来标识服务器处理后的状态 第二个参数:是对应着第一个参数状态码的描述信息,是一个字符串,不写默认是跟状态码相对应的默认描述
// 第三个参数:是一个对象,这个参数是要告诉浏览器,我将要发送的数据类型是什么
// 这个方法最好写在write方法之前调用
res.writeHead(200, 'miaov', {
'content-type' : 'text/html;charset=utf-8' //表示要发送html的文本数据类型,浏览器会对相应的数据类型进行解析
}); // write(chunk, [encoding]) : 发送一个数据块到响应正文中(将数据写入到客户端),第一个参数:要发送的数据,第二个参数:编码(可选)
res.write('<h1>hello</h1>'); // 当所有的正文和头信息发送完成以后调用该方法告诉服务器数据已经全部发送完成了,这个方法在每次完成信息发送以后必须调用,并且是最后调用
// 第一个参数:要发送的数据 第二个参数:编码,这个方法同样可以向客户端发送数据,并且发送完数据之后会结束这次请求
res.end();
})

response.end()方法产生两次访问的问题

var http = require('http'); //http是node中自带的一个模块,引入即可使用

http.createServer(function (request,response) {
response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
if(request.url !== "/favicon.ico"){ // 清除第二次访问
console.log("访问"); response.write("hello world");
response.end("") // 不写这个方法则会没有http协议尾,写了会产生两次访问
}
}).listen(9000)

最关键的就是 req.url 属性,表示用户的请求 URL 地址。所有的路由设计,都是通过 req.url 来实现的。 我们比较关心的不是拿到 URL,而是识别这个 URL,识别 URL,用到了下面的 url 模块

URL 模块的详解

URL模块的主要三个方法

url.parse()   // 解析 URL
url.format(urlObject) // 是上面 url.parse() 操作的逆向操作
url.resolve(from, to) // 添加或者替换地址

url.parse() 

parse这个方法是用来解析访问者的url,通常用于获取url后面的get传值

var http = require('http');
var url = require('url'); http.createServer(function(req,res){
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
}); if(req.url!='/favicon.ico'){
// http://localhost:8001/news?aid=123
console.log(req.url); //返回 /news?aid=123 // 第一个参数是地址,第二个参数是true的话表示把get传值转换成对象
var result = url.parse(req.url, true);
console.log(result) // 获取url的get传值,如果访问的链接中没有这个参数那么就是undefined
console.log('aid='+result.query.aid);
console.log('cid='+result.query.cid);
} res.write('你好 nodejs');
res.end(); // 结束响应
}).listen(8001);

运行并且浏览器分别http://localhost:8001http://localhost:8001/news?aid=123&cid=3访问,后台打印结果

/
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: [Object: null prototype] {},
pathname: '/',
path: '/',
href: '/' }
aid=undefined
cid=undefined
/news?aid=123&cid=3
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?aid=123&cid=3',
query: [Object: null prototype] { aid: '123', cid: '3' },
pathname: '/news',
path: '/news?aid=123&cid=3',
href: '/news?aid=123&cid=3' }
aid=123
cid=3

url.format(urlObject) 

var http=require('http');
var url=require('url'); http.createServer(function(req,res){
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
}); if(req.url!='/favicon.ico'){
// http://localhost:8001/news?aid=123
console.log(req.url); //返回 /news?aid=123 // 第一个参数是地址,第二个参数是true的话表示把get传值转换成对象
var result = url.parse(req.url, true);
var urlFormat = url.format(result);
console.log(urlFormat)
} res.write('你好 nodejs');
res.end(); // 结束响应
}).listen(8001);

运行并且浏览器分别http://localhost:8001http://localhost:8001/news?aid=123&cid=3访问,后台打印结果

/
/
/news?aid=123
/news?aid=123

url.resolve(from, to) 

var http=require('http');
var url=require('url'); http.createServer(function(req,res){
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
}); if(req.url!='/favicon.ico'){
// http://localhost:8001/news?aid=123
console.log(req.url); //返回 /news?aid=123 // 第一个参数是地址,第二个参数是true的话表示把get传值转换成对象
var result = url.parse(req.url, true);
var urlResolve = url.resolve(result, '/news?aid=123')
console.log(urlResolve)
} res.write('你好 nodejs');
res.end(); // 结束响应
}).listen(8001);

运行并且浏览器http://localhost:8001 访问,后台打印结果

/
/news?aid=123

当浏览器访问http://localhost:8001/news?cid=123,再查看结果参数被替换了

node.js HTTP模块、URL 模块的更多相关文章

  1. node(03)--利用 HTTP 模块 URl 模块 PATH 模块 FS 模块创建一个 WEB 服务器

    Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的三个 We ...

  2. node.js中使用http模块创建服务器和客户端

    node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...

  3. node.js(七) 子进程 child_process模块

    众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现 ...

  4. node.js第二天之模块

    一.模块的定义 1.在Node.js中,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分. 2.狭义的说,每一个JavaScript文件都是一个 ...

  5. node.js中的url.parse方法使用说明

    node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...

  6. Node.js中的URL

    Node.js中的URL 什么是URL URL是Uniform Location Resource的缩写,翻译为"统一资源定位符",也就是描述资源位置的固定表示方法.被URL描述的 ...

  7. node.js (01http 模块 url 模块)

    // 引入 http 模块-->Node.js 中的很多功能都是通过模块实现. var http = require('http'); // http.createServer() 方法创建服务 ...

  8. node.js当中的http模块与url模块的简单介绍

    一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务 ...

  9. node.js的fs核心模块读写文件操作 -----由浅入深

    node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFil ...

  10. 转 node.js里面的http模块深入理解

    问题1:HTTP服务继承了TCP服务模型,是从connection为单位的服务到以request为单位的服务的封装,那么request事件何时触发? 注意:在开启keepalive后,一个TCP会话可 ...

随机推荐

  1. Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)

    ​简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...

  2. 【Luogu5349】幂(分治FFT)

    [Luogu5349]幂(分治FFT) 题面 洛谷 题解 把多项式每一项拆出来考虑,于是等价于要求的只有\(\sum_{i=0}^\infty i^kr^i\). 令\(f(r)=\sum_{i=0} ...

  3. .NET CORE 控制台应用程序配置log4net日志文件

    使用文件格式记录日志 1.新建一个.NET CORE控制台应用程序,添加log4net.dll引用,打开工具->NuGet包管理器->管理解决方案的NuGet程序包. 2.在NuGet-解 ...

  4. MongoDB下载+安装+配置+错误解决方法

    下载 官网下载: https://www.mongodb.com/download-center/community Server=>Download 安装 下载完成后安装 建议下载根目录(下过 ...

  5. docker部署angular和asp.net core组成的前后端分离项目

    最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...

  6. 1-Kong文章记录

    参考: https://www.cnblogs.com/duanxz/p/9770645.html 系列博客可参考: 开源API网关系统(Kong教程)入门到精通 https://www.cnblog ...

  7. 【开发笔记】- grails框架中在使用domain的save方法保存时保存不成功

    1.如果报错,自行根据异常查找错误,这里不说明 2.如果为报错,我遇到的就是domain中的字段属性与数据库中为同步 (1)你的domain是新的,在增加新的字段属性时未使用update更新数据库,造 ...

  8. Vue axios异步获取后台数据alert提示undefined

    记录一个小问题,关于分页查询套餐 前台通过axios异步请求获取后台数据alert弹出数据提示undefined 下面有三个bean PageResult /** * 分页结果封装对象 */ publ ...

  9. Java单例模式的几种实现

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10845530.html 一:静态内部类实现单例模式 原理:通过一个静态内部类定义一个静态变量来持有当前类实例 ...

  10. Linux的网络参数设置

    前面讲解了lLinux 的IP组成,下面就讲一下Linux的网络设置和数据传递. 其实这地方对运维的人员来说,不会要精通,但还是要了解.必要时刻还会用到的 电脑之间数据的传递: 数据的传递要分为下面几 ...