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
相关产品推荐
相关产品推荐

