gpt4 book ai didi

javascript - 向客户端发送响应然后在 nodejs 中运行长/重操作的快速方法是什么

转载 作者:行者123 更新时间:2023-11-30 09:23:45 25 4
gpt4 key购买 nike

我想弄清楚,从 expressjs 发送响应然后在服务器中记录或执行长时间操作的最佳/快速方法是什么,而不会延迟对客户端的响应.

我有以下代码,但我看到只有在循环结束后才会发送对客户端的响应。我虽然会发送响应,因为我正在触发 res.send(html); 然后调用 longAction

function longAction () {
for (let i = 0; i < 1000000000; i++) {}
console.log('Finish');
}

function myfunction (req, res) {
res.render(MYPATH, 'index.response.html'), {title: 'My Title'}, (err, html) => {
if (err) {
re.status(500).json({'error':'Internal Server Error. Error Rendering HTML'});
}
else {
res.send(html);
longAction();
}
});
}


router.post('/getIndex', myfunction);

发送响应然后运行长/重 Action 的最佳方式是什么?或者我缺少什么?

最佳答案

I'm trying to figure out, what is the best/fast way to send the response from expressjs and then do log or do long actions in the server, without delaying the response to the client.

执行此操作的最佳方法是仅在 express 告诉您响应已发送时才调用 longAction()。由于响应对象是一个流,您可以在该流上使用 finish 事件来了解流中的所有数据何时已刷新到底层操作系统。

来自writable stream documentation :

The 'finish' event is emitted after the stream.end() method has been called, and all data has been flushed to the underlying system.

以下是如何在您的特定代码中使用它:

function myfunction (req, res) {
res.render(MYPATH, 'index.response.html'), {title: 'My Title'}, (err, html) => {
if (err) {
res.status(500).json({'error':'Internal Server Error. Error Rendering HTML'});
}
else {
res.on('finish', () => {
longAction();
});
res.send(html);
}
});
}

关于 finish 事件的更多解释,您可以从查看 Express code for res.send() 开始。并看到最终调用 res.end() 来实际发送数据。如果你再看看 documentation for .end()在可写流上,它是这样说的:

Calling the writable.end() method signals that no more data will be written to the Writable. The optional chunk and encoding arguments allow one final additional chunk of data to be written immediately before closing the stream. If provided, the optional callback function is attached as a listener for the 'finish' event.

因此,由于 Express 不公开访问 .end() 提供的回调,我们只需要自己监听 finish 事件,以便在流时收到通知已完成发送其最后一位数据。


请注意,您的代码中还有一个拼写错误,其中 re.status(500) 应该是 res.status(500)

关于javascript - 向客户端发送响应然后在 nodejs 中运行长/重操作的快速方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50064973/

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