这个回调函数在服务器返回响应头(headers)之后被调用,它接收 三个主要参数:

(图片来源网络,侵删)
response(对象)buffer(Buffer 对象,仅在 Node.js 18+ 中作为第二个参数提供)error(错误对象,仅在 Node.js 18+ 中作为第三个参数提供)
下面我们逐一详细说明。
参数详解
response 对象 (Node.js 10+)
这是最核心、最常用的参数,它是一个 http.IncomingMessage 类的实例,代表服务器的 响应流,它包含了服务器返回的所有信息,但不包含响应体。
response 对象的主要属性和方法:
-
response.statusCode(数字)
(图片来源网络,侵删)- 作用:HTTP 状态码,
200(成功),404(未找到),500(服务器内部错误)。 - 用法:这是判断请求是否成功的第一步。
console.log(`状态码: ${response.statusCode}`); // 状态码: 200 - 作用:HTTP 状态码,
-
response.statusMessage(字符串)- 作用:与状态码对应的消息,
OK,Not Found。 - 用法:通常用于日志记录。
console.log(`状态信息: ${response.statusMessage}`); // 状态信息: OK - 作用:与状态码对应的消息,
-
response.headers或response.rawHeaders(对象/数组)- 作用:包含服务器响应头部的信息。
Content-Type,Content-Length,Set-Cookie等。 - 用法:用于检查响应类型、内容长度等。
console.log('响应头:', response.headers); // 输出示例: { 'content-type': 'application/json', 'content-length': '53' } - 作用:包含服务器响应头部的信息。
-
response.setEncoding()(方法)- 作用:设置响应流的编码方式,如
'utf8',调用此方法后,你将不再需要手动处理Buffer,data事件会直接返回字符串。 - 用法:当你知道响应是文本(如 JSON, HTML)时非常有用。
response.setEncoding('utf8'); - 作用:设置响应流的编码方式,如
-
事件监听器 (
on方法)
(图片来源网络,侵删)response是一个可读流,所以你可以监听它的事件来处理数据。'data'事件:当有一块数据可读时触发,回调函数接收一个Buffer或字符串(如果调用了setEncoding)。'end'事件:当所有数据块都已传输完毕时触发,此事件只会触发一次。'error'事件:在接收响应过程中发生错误时触发。
buffer 参数 (Node.js 18+)
-
作用:这是一个
Buffer对象,包含了整个响应体,如果响应体很大,这可能会消耗大量内存。 -
注意:这是一个可选参数,只有在 Node.js 18.0.0 及更高版本中才提供,在旧版本中,你必须手动拼接
data事件中的Buffer来得到完整的响应体。 -
用法:当响应体很小,或者你希望一次性处理所有数据时,这个参数非常方便。
const https = require('https'); const req = https.request('https://api.example.com/data', (response, buffer) => { // 在 Node.js 18+ 中,buffer 直接包含了完整的响应体 console.log('通过 buffer 参数获取的响应体:', buffer.toString()); }); req.end();
error 参数 (Node.js 18+)
-
作用:如果在获取响应的过程中发生了错误(DNS 解析失败、TCP 连接被拒绝),这个参数会是一个
Error对象,如果一切正常,这个参数为null。 -
注意:这也是一个可选参数,仅在 Node.js 18+ 中提供,在旧版本中,你需要监听
response流上的'error'事件。 -
用法:这是一个更简洁的错误处理方式。
const https = require('https'); const req = https.request('https://non-existent-domain.xyz', (response, buffer, error) => { if (error) { console.error('请求失败:', error); return; } // 正常处理响应... console.log('状态码:', response.statusCode); }); req.end();
完整代码示例 (Node.js 18+)
下面是一个结合了所有参数和事件处理的完整示例,这是处理 request 回调最推荐的方式。
const https = require('https');
// 请求选项
const options = {
hostname: 'jsonplaceholder.typicode.com',
port: 443,
path: '/posts/1',
method: 'GET',
headers: {
'User-Agent': 'Node.js App'
}
};
// 创建请求
const req = https.request(options, (response, buffer, error) => {
// 1. 首先检查 error 参数 (Node.js 18+ 特性)
if (error) {
console.error('请求发生错误:', error.message);
return;
}
// 2. 检查响应状态码
if (response.statusCode !== 200) {
console.error(`请求失败,状态码: ${response.statusCode}`);
return;
}
// 3. 处理响应数据 (两种方式任选其一)
// 方式 A: 使用 Node.js 18+ 的 buffer 参数 (最简单)
try {
const data = JSON.parse(buffer.toString());
console.log('--- 使用 buffer 参数解析 ---');
console.log('用户ID:', data.userId);
console.log('标题:', data.title);
} catch (e) {
console.error('解析 buffer 失败:', e);
}
// 方式 B: 使用 'data' 和 'end' 事件 (更通用,适用于所有版本)
console.log('\n--- 使用事件流解析 ---');
let responseData = '';
response.setEncoding('utf8'); // 将数据流编码为 utf8 字符串
response.on('data', (chunk) => {
// chunk 是一个字符串
responseData += chunk;
});
response.on('end', () => {
try {
const data = JSON.parse(responseData);
console.log('用户ID:', data.userId);
console.log('标题:', data.title);
} catch (e) {
console.error('解析事件流数据失败:', e);
}
});
// 监听响应流本身的错误事件 (良好实践)
response.on('error', (err) => {
console.error('响应流发生错误:', err);
});
});
// 监听请求本身的错误事件 (网络问题)
req.on('error', (err) => {
console.error('请求本身发生错误:', err);
});
// 发送请求
req.end();
| 参数版本 | 参数列表 | 推荐处理方式 |
|---|---|---|
| Node.js < 18 | (response) |
监听 response.on('data', ...) 和 response.on('end', ...) 来获取和拼接响应体。监听 response.on('error', ...) 和 req.on('error', ...) 来处理错误。 |
| Node.js >= 18 | (response, buffer, error) |
优先检查 error 参数,处理请求/响应级别的错误。对于小响应体,直接使用 buffer 参数,非常方便。对于大响应体,仍然推荐使用 'data' 和 'end' 事件流式处理,以避免内存问题。同时监听 req.on('error', ...) 仍然是一个好习惯,可以捕获更底层的网络错误。 |
理解这三个参数以及 response 对象的用法,是掌握 Node.js http/https 模块进行网络请求的关键。
