You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js:使用request-promise模块如何在响应前执行函数并记录请求耗时?

我明白你想要实现的功能——在请求发出去之后、收到服务器响应前执行特定逻辑,同时精准记录请求发起和响应返回的时间,用来追踪那些服务器处理耗时久的请求。咱们来一步步调整你的代码,完美实现需求:

解决方案

首先先修正原代码里的变量声明小问题,再集成你需要的时间记录和响应前执行逻辑。这里推荐用async/await让代码更易读,同时精准控制执行时机:

// 假设你已经实现了getTime()函数,比如返回时间戳或格式化时间
function getTime() {
  return Date.now(); // 示例:返回毫秒级时间戳
}

const httpTimes = []; // 存储所有请求时间记录的数组

async function httpRequestCall(options) {
  // 1. 记录请求发起的时间点
  const timeJson = { before: getTime() };
  
  // 2. 发送请求(此时请求已发出,等待服务器响应)
  const requestPromise = request(options);
  
  // 3. 在这里执行你需要在响应前运行的函数
  executeBeforeResponse();
  
  try {
    // 4. 等待服务器返回响应
    const response = await requestPromise;
    
    // 5. 记录响应返回的时间点,并计算总耗时
    timeJson.after = getTime();
    timeJson.duration = timeJson.after - timeJson.before;
    
    // 处理响应数据
    const statusCode = response.statusCode;
    const responseData = response.body.data;
    console.log("Response:", responseData);
    
    // 把时间记录存入数组
    httpTimes.push(timeJson);
    
    return responseData; // 可返回数据供上层逻辑使用
  } catch (error) {
    // 异常场景也要记录时间,避免数据丢失
    timeJson.after = getTime();
    timeJson.error = error.message;
    httpTimes.push(timeJson);
    console.error("Request failed:", error);
    throw error; // 抛出错误让上层处理
  }
}

// 你需要在响应前执行的自定义函数示例
function executeBeforeResponse() {
  console.log("请求已发送,等待服务器响应中...");
  // 这里可以加入任何逻辑:比如打印日志、上报监控状态、执行本地计算等
}

关键细节说明

  • 时间记录时机:timeJson.before在请求发起前记录,timeJson.after在收到响应(或请求失败)后立刻记录,计算出的duration就是从客户端发请求到收到响应的总耗时,包含网络传输和服务器处理的时间。
  • 响应前函数执行:在调用request(options)得到Promise后立刻执行executeBeforeResponse,此时请求已经发往服务器,正处于等待响应的状态,完全符合你的需求。
  • 错误处理:加入try/catch块,确保即使请求失败,也能完整记录时间信息,避免遗漏异常请求的耗时数据。

如果你更习惯用Promise链式调用的风格,也可以这样写:

function httpRequestCall(options) {
  const timeJson = { before: getTime() };
  const requestPromise = request(options);
  
  // 执行响应前的函数
  executeBeforeResponse();
  
  return requestPromise
    .then((response) => {
      timeJson.after = getTime();
      timeJson.duration = timeJson.after - timeJson.before;
      
      const statusCode = response.statusCode;
      const responseData = response.body.data;
      console.log("Response:", responseData);
      
      httpTimes.push(timeJson);
      return responseData;
    })
    .catch((error) => {
      timeJson.after = getTime();
      timeJson.error = error.message;
      httpTimes.push(timeJson);
      console.error("Request failed:", error);
      throw error;
    });
}

如果需要对所有请求做通用的前置/后置处理,可以用request-promise的拦截器抽离逻辑:

// 全局请求拦截器:请求发送到网络前执行
request.interceptors.request.use((requestOptions) => {
  console.log("即将发送请求至:", requestOptions.url);
  // 这里可以统一添加请求头、打印请求日志等
  return requestOptions;
});

// 全局响应拦截器:收到响应后、进入业务逻辑前执行
request.interceptors.response.use((response) => {
  console.log("收到响应,状态码:", response.statusCode);
  // 这里可以统一处理响应格式、校验数据等
  return response;
});

内容的提问来源于stack exchange,提问作者G. Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:06