首页 > 解决方案 > 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...
}

但它永远不会被调用

标签: node.jsmultithreadingasynchronous

解决方案


如果您不希望响应等待数据库操作完成,则可以执行以下任一操作:

// 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()以便错误不会未处理。可能您只需要记录它,因为此时无法通知客户端。


推荐阅读