0
点赞
收藏
分享

微信扫一扫

Node.js HTTP 模块(3)

前言

前文详细介绍了 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();
});

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

Node.js HTTP 模块(3)_HTTP

设置响应头

使用 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)_HTTP_02

Node.js HTTP 模块(3)_HTTP_03

设置响应内容

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

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

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

Node.js HTTP 模块(3)_Node.js_04

有两个方法可用,一个前面一直使用的 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)_HTTP_05

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

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)_HTTP_06

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

总结

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

举报

相关推荐

0 条评论