Node.js HTTP 模块详解(3):response 对象
前言
前文详细介绍了 request
对象的用法,用来处理解析出客户端所传递的信息。完成一次完整的 HTTP 通信,还需要服务器进行响应,这就要用到 response
对象了。
response 对象
相对 request
对象来说,response
对象的用法就简单多了,主要就是设置状态码,响应头和响应给客户端的内容。
状态码
状态码(Status Code)表示此次请求的状态,是成功还是失败,是哪里有什么错误等等。
HTTP 协议规范的状态码分为五类,分别使用 1- 5 开头的三位数字表示:
状态码分类 | 类别 |
---|---|
1xx | 信息 |
2xx | 成功 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
下面是常用的状态码。
状态码 | 原因短语 | 含义 |
---|---|---|
200 | OK | 请求成功,通常会在响应体中携带数据 |
204 | No Content | 请求成功,但是没有响应体 |
206 | Partial Content | 部分请求成功,是分块下载和断点续创的基础 |
301 | Moved Permanently | 永久重定向 |
302 | 302 Found | 临时重定向 |
304 | Not Modified | 表示资源没有发生变动,可以继续使用当前资源,用于协商缓存 |
400 | Bad Request | 客户端错误,具体原因不明 |
401 | Unauthorized | 用户没有登录 |
403 | Forbidden | 并非客户端发生了错误,而是服务器禁止访问此资源 |
404 | Not Found | 请求的资源不存在 |
405 | Method Not Allowed | 请求方法不被服务器支持 |
500 | Internal Server Error | 服务器内部错误,具体原因不明 |
502 | Bad Gateway | 服务器没问题,但是代理网关错误 |
503 | Service Unavailable | 服务器当前比较忙,无法处理响应 |
状态码是给机器看的,原因短语是给人看的。客户端会根据状态码做不同的处理,人可以看原因短语来看具体的状态。
设置状态码
设置状态码有两种方式:
http.createServer((request, response) => {
const { pathname } = url.parse(request.url)
if (pathname === '/home') {
response.end('首页')
}
response.statusCode = 404;
// Or
response.writeHead(404);
response.end();
});
设置原因短语也有两种方式:
// 2. 调用 createServer 方法创建服务
const server = http.createServer((request, response) => {
const { pathname } = url.parse(request.url)
if (pathname === '/home') {
response.end('首页')
}
response.statusCode = 404;
response.statusMessage = 'Not Found!'
// Or
response.writeHead(404, 'Not Found!');
response.end();
});
看下效果,当访问一个不存在的地址时:
设置响应头
使用 response.setHeader
或者 response.writeHead
:
http.createServer((request, response) => {
// 设置自定义的响应头
response.setHeader('username', 'Kunwu');
// 设置 Content-Type
response.setHeader('Content-Type', 'application/json')
// 或者
response.writeHead(200, {
'Content-Type': 'application/json'
})
response.end(JSON.stringify({ username: 'Kunwu' }));
})
设置响应内容
response
对象是一个可写流,当可写流不关闭时,将会一直处于等待状态。比如一个空的服务:
http.createServer((request, response) => {
});
当客户端发起请求,服务没有结束响应,那么客户端将一直处于等待状态:
有两个方法可用,一个前面一直使用的 response.end
,另一个是用的较少的response.write
。
先说后者,write
方法会写入数据,但不会关闭流,也就不会结束响应。end
方法既可以写入数据,又可以关闭流,结束此次请求。
http.createServer((request, response) => {
response.write('Hello,');
response.write('World!');
response.write('\n');
response.end('结束响应');
});
在浏览器中访问服务,发现能响应,但是中文出现了乱码:
这是由于浏览器使用了默认的编码格式来解析内容,不能正确解析中文字符。所以服务器在响应内容时,通常还需要通过响应头告知客户端采用何种编码:
http.createServer((request, response) => {
response.setHeader("Content-type", "text/plain;charset=utf-8");
response.write('Hello,');
response.write('World!');
response.write('\n');
response.end('结束响应');
});
浏览器再次访问服务:
还有一点,response.end
和 write
方法接收的数据的类型有三种,String、Buffer 和 Uint8Array。在设置响应内容时,通常都是使用字符串类型的数据。一定要注意的是,每次请求,都一定要调用 response.end
来结束响应。
总结
本文主要介绍 reponse
对象的用法,通过它提供的属性或方法,来设置响应状态码,响应头和响应体。结合前文对 request
对象的介绍,我们就可以在 createServer
方法中处理请求和响应内容了。但是这个过程比较繁琐,我们要自己解析、处理各种数据,并且代码还杂糅一块,很不优雅。所以后来才有了各种框架来提升开发的效率和体验。后面的文章中会介绍 Node.js 中常用的 Web 框架。
转载自:https://juejin.cn/post/7195770700106596412