likes
comments
collection
share

Node.js HTTP 模块详解(3):response 对象

作者站长头像
站长
· 阅读数 73

前言

前文详细介绍了 request 对象的用法,用来处理解析出客户端所传递的信息。完成一次完整的 HTTP 通信,还需要服务器进行响应,这就要用到 response 对象了。

response 对象

相对 request 对象来说,response 对象的用法就简单多了,主要就是设置状态码响应头响应给客户端的内容

状态码

状态码(Status Code)表示此次请求的状态,是成功还是失败,是哪里有什么错误等等。

HTTP 协议规范的状态码分为五类,分别使用 1- 5 开头的三位数字表示:

状态码分类类别
1xx信息
2xx成功
3xx重定向
4xx客户端错误
5xx服务器错误

下面是常用的状态码。

状态码原因短语含义
200OK请求成功,通常会在响应体中携带数据
204No Content请求成功,但是没有响应体
206Partial Content部分请求成功,是分块下载和断点续创的基础
301Moved Permanently永久重定向
302302 Found临时重定向
304Not Modified表示资源没有发生变动,可以继续使用当前资源,用于协商缓存
400Bad Request客户端错误,具体原因不明
401Unauthorized用户没有登录
403Forbidden并非客户端发生了错误,而是服务器禁止访问此资源
404Not Found请求的资源不存在
405Method Not Allowed请求方法不被服务器支持
500Internal Server Error服务器内部错误,具体原因不明
502Bad Gateway服务器没问题,但是代理网关错误
503Service 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();
});

看下效果,当访问一个不存在的地址时:

Node.js HTTP 模块详解(3):response 对象

设置响应头

使用 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' }));
})

Node.js HTTP 模块详解(3):response 对象

Node.js HTTP 模块详解(3):response 对象

设置响应内容

response 对象是一个可写流,当可写流不关闭时,将会一直处于等待状态。比如一个空的服务:

http.createServer((request, response) => {
  
});

当客户端发起请求,服务没有结束响应,那么客户端将一直处于等待状态:

Node.js HTTP 模块详解(3):response 对象

有两个方法可用,一个前面一直使用的 response.end,另一个是用的较少的response.write

先说后者,write 方法会写入数据,但不会关闭流,也就不会结束响应。end 方法既可以写入数据,又可以关闭流,结束此次请求

http.createServer((request, response) => {
​
    response.write('Hello,');
    response.write('World!');
    response.write('\n');
    response.end('结束响应');
});

在浏览器中访问服务,发现能响应,但是中文出现了乱码:

Node.js HTTP 模块详解(3):response 对象

这是由于浏览器使用了默认的编码格式来解析内容,不能正确解析中文字符。所以服务器在响应内容时,通常还需要通过响应头告知客户端采用何种编码:

http.createServer((request, response) => {
​
    response.setHeader("Content-type", "text/plain;charset=utf-8");
    
    response.write('Hello,');
    response.write('World!');
    response.write('\n');
    response.end('结束响应');
});

浏览器再次访问服务:

Node.js HTTP 模块详解(3):response 对象

还有一点,response.endwrite 方法接收的数据的类型有三种,String、Buffer 和 Uint8Array。在设置响应内容时,通常都是使用字符串类型的数据。一定要注意的是,每次请求,都一定要调用 response.end 来结束响应。

总结

本文主要介绍 reponse 对象的用法,通过它提供的属性或方法,来设置响应状态码,响应头和响应体。结合前文对 request 对象的介绍,我们就可以在 createServer 方法中处理请求和响应内容了。但是这个过程比较繁琐,我们要自己解析、处理各种数据,并且代码还杂糅一块,很不优雅。所以后来才有了各种框架来提升开发的效率和体验。后面的文章中会介绍 Node.js 中常用的 Web 框架。

转载自:https://juejin.cn/post/7195770700106596412
评论
请登录