nodejs学习--04

    xiaoxiao2022-07-07  178

    http模块

    http服务器处理模块 node不同于Apache,安装完node并没有一个能够提供Web服务环境,需要使用http模块自己来搭建>Web服务器

    http是一个系统模块,让我们能够通过简单的流程创建一个Web服务器

    http模块搭建Web服务器

    使用http模块搭建Web服务器 创建 Web 服务器的步骤 导入 http 核心模块创建 server 对象(server 对象负责建立连接,接收数据)注册 request 事件,当浏览器发送请求到服务器执行,设置处理请求的函数监听端口(这个步骤也可以放到注册request事件之前) // 0. 加载 http 核心模块 var http = require('http') // 1. 创建服务器,得到 Server 实例 var server = http.createServer() // 2. 监听客户端的 request 请求事件,设置请求处理函数 server.on('request', function (req, res) { // 形参req是请求request的简写 // 形参res是响应response的简写 console.log('收到客户端的请求了') }) // 3. 绑定端口号,启动服务器 server.listen(3000, function () { console.log('Server is running at port 3000.') }) 当服务器接收到浏览器的请求后,如果没有做出响应,浏览器会等待服务器的最终目的是要根据请求做出响应

    如何对浏览器的请求做出响应

    当收到浏览器的请求后,会调用处理请求的函数(有两个核心参数 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的不同,做出合适的响应呢?当然可以,那么首先就需要知道浏览器请求的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方式提交的数据

    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.') })

    处理静态资源

    静态资源指的是html文件中链接的外部资源,如css、js、image文件等等。如果请求的a.html 文件中链接了外部文件(静态资源),比如css、images、js文件等,浏览器会自动再次发送请求,向服务器请求这些文件服务器要判断浏览器请求的路径是否是静态资源,如果是静态资源把静态资源的内容返回给浏览器
    浏览器请求了静态资源文件,服务器就得做出响应,而且还要指定响应数据的类型,否则浏览器会把字符串当做纯文本处理。 建议每个响应都告诉客户端我给你发送的 Content-Type 内容类型是什么

    为不同的文件类型设置不同的 Content-Type

    .html:text/html.css:text/css.js:application/javascript.jpg:image/jpg

    response.setHeader(‘Content-Type’, ‘text/css’);

    处理 404

    404是一个响应状态码,表示请求的资源不存在如果请求未处理的路径,服务器不会做任何的响应,此时浏览器处于等待状态如果浏览器请求未处理的路径,统一设置响应码 404,并做友好提示 // 设置状态码为404 response.statusCode = 404; response.end('对不起,您请求的页面未找到');
    最新回复(0)