node.js - Node.js 中的多线程:如何从路由器返回响应,但在单独的线程中执行其他操作?
问题描述
我有一个使用需要执行多个耗时操作的路由器的获取路由(其持续时间通常会导致 Postman 或任何查询我的后端超时)。我想返回一些 JSON 响应,但随后还要继续在单独的线程中执行其他操作。这些操作将写入我的数据库,因此我知道它们不会包含在请求响应中。
这是我的代码:
router.get('/test', async (req, res) => {
await querySources(req.query.id, req.query.name) // this operation takes a very long time, and has no effect on return value
return res.status(500).json({message: "success"})
}
我尝试将querySources
调用放在这样的异步块中:
async () => {
querySources...
}
但它永远不会被调用
解决方案
如果您不希望响应等待数据库操作完成,则可以执行以下任一操作:
// remove the await so you don't wait for the query to finish
router.get('/test', (req, res) => {
querySources(req.query.id, req.query.name).catch(...)
res.status(500).json({message: "success"})
}
或者
// send the response immediately, then do the database stuff
router.get('/test', (req, res) => {
res.status(500).json({message: "success"})
querySources(req.query.id, req.query.name).catch(...)
}
请注意,您将需要一些能力来捕捉任何错误,querySources()
以便错误不会未处理。可能您只需要记录它,因为此时无法通知客户端。