gpt4 book ai didi

Node.js Express - 在完成处理整个请求之前提供 HTTP 响应

转载 作者:搜寻专家 更新时间:2023-10-31 22:52:13 25 4
gpt4 key购买 nike

我有一个 Node.js Express 服务器,我在其中发送响应,然后尝试对同一请求实例进行更多处理。

如果我在发送 header 后写入 res,我会得到一个错误 - 但是如果我在发送回相应响应的响应后使用 req 可读流会发生什么情况?

换句话说,在我处理完整个请求之前,如何使用 Node.server 发送 HTTP 响应?

other 换句话说,如果我已经发回了一个响应,我怎么能在已经发送响应之后“消费”请求 - 除了发送之外真的只是做任何事情的问题返回响应?

现在,似乎有一些奇怪的错误与使用与已发送的响应相对应的请求对象(流)有关。

让我举一些例子,代码-

下面显示了我服务器中的最后 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 或类似的队列)并创建一个异步使用队列中消息的工作程序。

关于Node.js Express - 在完成处理整个请求之前提供 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34260078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com