http服务器处理模块 node不同于Apache,安装完node并没有一个能够提供Web服务环境,需要使用http模块自己来搭建>Web服务器
http是一个系统模块,让我们能够通过简单的流程创建一个Web服务器当收到浏览器的请求后,会调用处理请求的函数(有两个核心参数 request 和 response)
请求已经能够收到了,现在急需给浏览器的请求做出响应,这里就使用到了处理请求的函数,具体的是使用到了该函数的第二个参数,见下面的代码。
// 代码片段 server.on('request', function (req, res) { // 该函数就是处理请求响应的函数 // 形参res是响应response的简写 }) 形参res 形参res是response的缩写响应对象,服务器给浏览器返回的响应内容,可以通过该对象设置res.write() 设置响应体(返回给浏览器的内容)的内容,可以多次调用,但是只调用write不会做出响应,发送响应要调用 end()res.end() 把响应报文(响应行、响应头、响应体)发送给浏览器res.setHeader() 设置响应头,比如设置响应体的编码statusCode 设置状态码 响应代码 // 0. 加载 http 核心模块 var http = require('http') // 1. 创建服务器,得到 Server 实例 var server = http.createServer() // 2. 监听客户端的 request 请求事件,设置请求处理函数 server.on('request', function (req, res) { // 设置响应头,设置编码,否则浏览器收到的是乱码 res.setHeader('Content-Type', 'text/html; charset=utf-8'); // end中就是返回给浏览器的数据 res.end('hello,我是服务器,我收到你的请求了'); }) // 3. 绑定端口号,启动服务器 server.listen(3000, function () { console.log('Server is running at port 3000.') }) // 如果需要将一个html页面返回给浏览器,则读取文件,然后返回即可 var http = require('http') var fs = require('fs'); // 1. 创建服务器,得到 Server 实例 var server = http.createServer() // 2. 监听客户端的 request 请求事件,设置请求处理函数 server.on('request', function (req, res) { fs.readFile('./test.html', (err, data) => { // 如果读取中出现错误,则抛出错误 if (err) throw err; // 没有错误,则返回读取的html,因为html中设置编码,所以这里不需要设置编码 res.end(data); }); }) // 3. 绑定端口号,启动服务器 server.listen(3000, function () { console.log('Server is running at port 3000.') })前面已经可以对浏览器的请求做出响应了,但是响应的内容总是一样的。能不能根据url的不同,做出合适的响应呢?当然可以,那么首先就需要知道浏览器请求的url是什么。
涉及到和请求相关的信息,都是通过请求响应处理函数的第一个参数完成的。
server.on('request', function (req, res) { // 形参req 是 请求request的意思,所有和请求相关的信息,都在req对象中 }) 形参req 请求对象,浏览器发送的请求报文中的数据已经被解析到该对象上request.url 获取请求行中的路径request.method 获取请求行中的请求方法request.headers 获取请求头 代码实例 // 服务器中有3个html文件,分别是a.html b.html c.html // 根据浏览器发来的不同的请求,分别返回这三个文件的内容 var http = require('http') // 1. 创建服务器,得到 Server 实例 var server = http.createServer() // 2. 监听客户端的 request 请求事件,设置请求处理函数 server.on('request', function (req, res) { // 根据请求对象req,得到请求url let url = req.url; if (url === '/a') { // 读取a.html,并通过res.end()响应浏览器的请求 } else if (url === '/b') { // 读取b.html,并通过res.end()响应浏览器的请求 } else if (url === '/c') { // 读取c.html,并通过res.end()响应浏览器的请求 } }) // 3. 绑定端口号,启动服务器 server.listen(3000, function () { console.log('Server is running at port 3000.') })POST请求一般会提交数据给服务器,服务器在接收数据的时候也是分块接收的
var http = require('http') // 1. 创建服务器,得到 Server 实例 var server = http.createServer() // 2. 监听客户端的 request 请求事件,设置请求处理函数 server.on('request', function (req, res) { // 假设 /add 是POST方式的请求 if (req.url === '/add') { // 注册req的data事件,分块接收数据 let str = ''; req.on('data', (chunk) => { str += chunk; // chunk 是块的意思,这里将分块接收到的数组拼接到str字符串中 }); // 注册req的end事件,当数据都接收到了,会触发end事件 req.on('end', () => { // 这里处理用户提交的数据 console.log(str); }); } }) // 3. 绑定端口号,启动服务器 server.listen(3000, function () { console.log('Server is running at port 3000.') })为不同的文件类型设置不同的 Content-Type
.html:text/html.css:text/css.js:application/javascript.jpg:image/jpgresponse.setHeader(‘Content-Type’, ‘text/css’);