在 express 中结束 HTTP 请求之前调用异步函数
Calling async functions before ending HTTP Request in express
我的快递服务器上有以下路线:
router.post("/doHeavyTask", async function (req, res) {
const status = heavyTask(req)
logAction(HEAVY_TASK) // logAction is defined below
return res.status(status).send()
})
和以下日志函数,它只是将文档插入我的 mongoDB 数据库:
export function logAction(type: USER_LOG_TYPES){
const db = getAppDatabase()
const userLog: UserLog = {
logType: type
}
getAppDatabase().db.collection('UserLogs').insertOne(userLog).then((insertedDoc) => {
// ...
// handle success
return
}).catch((error) => {
// ...
// handle failure
return
})
}
在结束 HTTP 请求之前调用异步函数(在我的例子中是 logAction)会导致任何问题吗?有什么需要注意的吗?
真的取决于你的繁重任务是做什么的。如果它涉及到稍微改变用户状态,那么在你完成 res.send() 之后,用户可能会有一个替代状态。
E.x。如果 HEAVY TASK 只是将日志添加到数据库中,您可以这样做并告诉用户它正在由 res.send() 插入,理论上没问题。
但是如果 TEAVY TASK 想要做一些像更改用户名这样的事情,那么当你点击 res.send() 时,任务仍然是 运行 并且用户暂时仍然看不到他们的用户名已更改。
我的快递服务器上有以下路线:
router.post("/doHeavyTask", async function (req, res) {
const status = heavyTask(req)
logAction(HEAVY_TASK) // logAction is defined below
return res.status(status).send()
})
和以下日志函数,它只是将文档插入我的 mongoDB 数据库:
export function logAction(type: USER_LOG_TYPES){
const db = getAppDatabase()
const userLog: UserLog = {
logType: type
}
getAppDatabase().db.collection('UserLogs').insertOne(userLog).then((insertedDoc) => {
// ...
// handle success
return
}).catch((error) => {
// ...
// handle failure
return
})
}
在结束 HTTP 请求之前调用异步函数(在我的例子中是 logAction)会导致任何问题吗?有什么需要注意的吗?
真的取决于你的繁重任务是做什么的。如果它涉及到稍微改变用户状态,那么在你完成 res.send() 之后,用户可能会有一个替代状态。
E.x。如果 HEAVY TASK 只是将日志添加到数据库中,您可以这样做并告诉用户它正在由 res.send() 插入,理论上没问题。
但是如果 TEAVY TASK 想要做一些像更改用户名这样的事情,那么当你点击 res.send() 时,任务仍然是 运行 并且用户暂时仍然看不到他们的用户名已更改。