一个网站的加载流程粗略的流程大概以下:javascript
用户经过浏览器发送一个http的请求到指定的主机html
服务器接收到该请求,对该请求进行分析和处理java
服务器处理完成之后,返回对应的数据到用户机器node
浏览器接收服务器返回的数据,并根据接收到的进行分析和处理git
咱们须要搭建一个 http
的服务器,用于处理用户发送的 http
请求,在 node 中有 http
核心模块能够在很简单的几句话就帮咱们启动一个服务器。github
// 导入http模块: var http = require('http'); // 建立http server,并传入回调函数: var server = http.createServer(function (request, response) { // 回调函数接收request和response对象, console.log('有客户端请求了.....'); // 将HTTP响应200写入response, 同时设置Content-Type: text/html: response.writeHead(200, {'Content-Type': 'text/html'}); // 将HTTP响应的HTML内容写入response: response.write('<h1>hello World!</h1>'); response.end(); }); // 让服务器监听8888端口: server.listen(8888); console.log('Server is running at http://127.0.0.1:8888/');
就这几行代码,咱们就搭建了一个简单服务器,当咱们将其运行,访问地址能在浏览器中显示咱们熟悉的 hello World!
,迈出了第一步。web
下面咱们来看看几个重要的地方:api
首先咱们来看建立http server
的代码:数组
var server = http.createServer([requestListener])
:建立并返回一个HTTP服务器对象浏览器
requestListener
: 监听到客户端链接的回调函数
在这里能够看到咱们的回调函数是可选的,咱们还可使用事件监听器来进行,监听到客户端链接以后的操做,如:
server.on('request', function(req, res) {// do ....})
咱们要在用户访问时作一些什么,都会在这里。
再看监听端口的代码,在这里咱们只是简单的写了一下监听的端口,它的可选项都没有去设置
server.listen(port, [hostname], [backlog], [callback])
:监听客户端链接请求,只有当调用了 listen
方法之后,服务器才开始工做
port
: 监听的端口
hostname
: 主机名(IP/域名),可选
backlog
: 链接等待队列的最大长度,可选
callback
: 调用listen方法并成功开启监听之后,会触发一个 listening事件,callback将做为该事件的执行函数,可选
看完了建立与监听的方法,咱们再看看看,咱们在监听到客户端链接的回调函数 server.on('request', function(req, res) {// do ....})
中看到有两个参数 request 和 response ,
在这两个参数中,咱们能够去得到用户的当前请求一些信息,好比头信息,数据等待,还能够向该次请求的客户端输出返回响应,下面咱们一块儿看看它里面的内容
参数request
对象是 http.IncomingMessage
的一个实例,经过它 ,咱们能够获取到此次请求的一些信息,好比头信息,数据,url
参数等等
这里简单的列一下最多见的:
httpVersion
: 使用的http协议的版本
headers
: 请求头信息中的数据
url
: 请求的地址
method
: 请求方式
参数 response
对象是 http.ServerResponse
(这是一个由HTTP服务器内部建立的对象) 的一个实例,经过它 咱们能够向该次请求的客户端输出返回响应。
response.writeHead(statusCode, [reasonPhrase], [headers])
:向请求回复响应头,这个方法只能在当前请求中使用一次,而且必须在response.end()
以前调用。
statusCode
: 一个三位数的HTTP状态码, 例如 404
reasonPhrase
:自行设置http响应状态码对应的缘由短语
headers
:响应头的内容
write(chunk, [encoding])
: 发送一个数据块到响应正文中 ,若是这个方法被调用可是 response.writeHead()
没有被调用,
它将切换到默认header模式并更新默认的headers。chunk能够是字符串或者缓存。若是chunk 是一个字符串,
第二个参数代表如何将这个字符串编码为一个比特流。默认的 encoding是'utf8'。
end([data], [encoding])
: 当全部的正文和头信息发送完成之后,调用该方法告诉服务器数据已经所有发送完成了。
这个方法在每次完成信息发送之后必须调用,而且是最后调用,若是指定了参数 data , 就至关于先调用 response.write(data, encoding)
以后再调用 response.end()
setHeader(name, value)
: 为默认或者已存在的头设置一条单独的头信息:若是这个头已经存在于 将被送出的头中,将会覆盖原来的内容。若是我想设置更多的头, 就使用一个相同名字的字符串数组
如:response.setHeader("Set-Cookie", ["type=ninja", "language=javascript"]);
看了那么多api,是时候实践一把了,咱们再来对原来的代码进行一点改造~
// 导入http模块,url 模块 var http = require('http'); var url = require('url') // 建立http server var server = http.createServer(); server.on('request', function (req, res) { // 将HTTP响应200写入response, 同时设置Content-Type: text/html: res.writeHead(200, { 'Content-Type': 'text/html' }); var urlObj = url.parse(req.url); //根据用户访问的url不一样展现不一样的页面 switch (urlObj.pathname){ // 这是首页 case '/': res.write('<h1>这是里首页</h1>'); break; case '/user': res.write('<h1>这里是我的中心</h1>'); break; default : res.write('<h1>你要找的页面不见了~</h1>'); break; } // 将HTTP响应的HTML内容写入response: res.end(); }); server.listen(8888); console.log('Server is running at http://127.0.0.1:8888/');
启动一下该js文件,而且经过不一样的url不一样的后缀,如 /
和 /user
去访问这个地址,看看浏览器的输出,应该已经变了。
这就是经过简单的的url处理,来实现的路由机制拉~
固然这里咱们再继续深刻一下!结合 node 的文件系统(fs模块),使不一样的url,直接读取不一样的 html 文件,示例:
准备工做: 在当前文件目录下创建html
文件夹, 而且新增文件 index.html
与 user.html
,内容自行发挥
var http = require('http'); var url = require('url'); var fs = require('fs'); var server = http.createServer(); // 读取咱们当前文件所在的目录下的 html 文件夹 var HtmlDir = __dirname + '/html/'; server.on('request', function(req, res) { var urlObj = url.parse(req.url); switch (urlObj.pathname) { case '/': //首页 sendData(HtmlDir + 'index.html', req, res); break; case '/user': //用户首页 sendData(HtmlDir + 'user.html', req, res); break; default: //处理其余状况 sendData(HtmlDir + 'err.html', req, res); break; } }); /** * 读取html文件,响应数据,发送给浏览器 * @param {String} file 文件路径 * @param {Object} req request * @param {Object} res response 对象 */ function sendData(file, req, res) { fs.readFile(file, function(err, data) { if (err) { res.writeHead(404, { 'content-type': 'text/html;charset=utf-8' }); res.end('<h1>你要找的页面不见了~</h1>'); } else { res.writeHead(200, { 'content-type': 'text/html;charset=utf-8' }); res.end(data); } }); } server.listen(8888); console.log('Server is running at http://127.0.0.1:8888/');
运行文件,切换url,程序会将不一样的页面返回。你们本身去试试吧!
这是对于 node 的 http模块 的学习,理解有限,若是有错误之处,请指出,谢谢!