requestcallback 入口参数

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 参数 正文

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

requestcallback 入口参数
(图片来源网络,侵删)
  1. response (对象)
  2. buffer (Buffer 对象,仅在 Node.js 18+ 中作为第二个参数提供)
  3. error (错误对象,仅在 Node.js 18+ 中作为第三个参数提供)

下面我们逐一详细说明。


参数详解

response 对象 (Node.js 10+)

这是最核心、最常用的参数,它是一个 http.IncomingMessage 类的实例,代表服务器的 响应流,它包含了服务器返回的所有信息,但不包含响应体

response 对象的主要属性和方法:

  • response.statusCode (数字)

    requestcallback 入口参数
    (图片来源网络,侵删)
    • 作用:HTTP 状态码,200 (成功), 404 (未找到), 500 (服务器内部错误)。
    • 用法:这是判断请求是否成功的第一步。
    console.log(`状态码: ${response.statusCode}`); //  状态码: 200
  • response.statusMessage (字符串)

    • 作用:与状态码对应的消息,OK, Not Found
    • 用法:通常用于日志记录。
    console.log(`状态信息: ${response.statusMessage}`); //  状态信息: OK
  • response.headersresponse.rawHeaders (对象/数组)

    • 作用:包含服务器响应头部的信息。Content-Type, Content-Length, Set-Cookie 等。
    • 用法:用于检查响应类型、内容长度等。
    console.log('响应头:', response.headers);
    // 输出示例: { 'content-type': 'application/json', 'content-length': '53' }
  • response.setEncoding() (方法)

    • 作用:设置响应流的编码方式,如 'utf8',调用此方法后,你将不再需要手动处理 Bufferdata 事件会直接返回字符串。
    • 用法:当你知道响应是文本(如 JSON, HTML)时非常有用。
    response.setEncoding('utf8');
  • 事件监听器 (on 方法)

    requestcallback 入口参数
    (图片来源网络,侵删)
    • 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 模块进行网络请求的关键。

-- 展开阅读全文 --
头像
2025款MacBook Pro 13拆机有何升级或变化?
« 上一篇 11-29
yeelight智能灯泡怎么连接手机控制?
下一篇 » 11-29

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]