我有一个Node.js Express服务器,我发送响应,然后尝试使用相同的请求实例进行更多处理. 如果我在发送标题后写入res,我将收到错误 – 但是如果我在发回相应响应的响应后使用req可读流会发
如果我在发送标题后写入res,我将收到错误 – 但是如果我在发回相应响应的响应后使用req可读流会发生什么?
换句话说,在完成处理整个请求之前,如何向Node.server发送HTTP响应?
换句话说,如果我已经发回了响应,那么在已经发送响应之后如何“消耗”请求 – 除了发回响应之外,还有什么事情要做?
现在,似乎有一些与使用与已发送的响应相对应的请求对象(流)相关的奇怪错误.
让我举一些例子,用代码 –
以下显示了我服务器中的最后3个Express中间件处理程序.作为一个有趣的旁注 – 一旦为请求调用了一个中间件处理程序,就无法重新调用它(它看起来是这样).所以会发生的是下面的第一个处理程序在发送响应时被调用.然后,另一个执行路径(使用process.nextTick或setImmediate)调用next(),然后调用后两个处理程序,这意味着我最终得到了404在我的服务器上登录.
app.use(function (req, res, next) { var r; var timeRequired = (Date.now() - req.request_start) + 'ms'; console.log("Time required for request:", timeRequired); if (r = req.lectalTemp) { if (!req.lectalSent) { req.lectalSent = true; res.status(r.status).json({timeRequired: timeRequired, success: r.data}); } else { console.log('Headers sent already, but here is the data that would have been sent:', r); } } else { next(); } }); // catch 404 and forward to error handler app.use(function (req, res, next) { var err = new Error('404: Not Found - ' + req.method + ' ' + req.originalUrl); err.status = 404; next(err); }); app.use(function (err, req, res, next) { var timeRequired = (Date.now() - req.request_start) + 'ms'; if (app.get('env') === 'production') { res.status(err.status || 500).json({ error: 'sorry the API experienced an error serving your priority request' }); } else { console.error(colors.bgRed(err), '\n', err.stack); if (!res.headersSent && !req.lectalSent) { req.lectalSent = true; res.status(err.status || 500).json({ error: { timeRequired: timeRequired, errMessage: err.message, errStack: err.stack } }); } } });我会用队列解决这个问题.将具有低关键数据的消息发布到队列(例如RabbitMq或类似物),并创建一个异步使用队列中消息的工作程序.