我正在使用节点Express和Postgress。 我不确定我想做的是好的做法还是很大的错误。 我已经将结果返回给客户端之后,将数据异步保存到数据库中。
我试图用console.log进行演示,以检查保存期间服务器是否被阻止。
在这里您可以看到status
路线和statusB
路线。
app.get("/statusB", async (req, res) => {
return res.status(200).send("testAAA");
});
app.get("/status", async (req, res) => {
const userStats = await UserController.getData("id")
const x = test();
return res.status(200).send(userStats);
});
async function test() {
return new Promise(() => {
for (let x = 0; x < 10000; x++) {
setTimeout( () => {
console.log(x)
}, 5000);
}
})
}
如果我发送/status
,并且在发送statusB
之后立即发送邮件,我该怎么办。
我希望输出为:
/status
将返回userStats数据
/StatusB
返回“ testAAA”
并且计数器将异步运行。
但是实际的输出是:
-/status
返回userStats数据
-柜台跑
-/StatusB
仅在计数器结束后才返回“ testAAA”
仅对控制台日志进行测试,以了解是否可以代替控制台日志异步获取并保存数据到数据库。
答案 0 :(得分:1)
取决于您的业务案例。
如果即使保存可能实际上失败了,也可以让客户获得200 OK
状态代码,那么可以肯定的是,您可以在响应后异步进行操作。
在其他情况下,您将希望在请求中进行保存,并且仅在确定一切都安全无事后做出响应。
答案 1 :(得分:0)
例如,要想将已保存的资源返回给客户端,这取决于您的逻辑,您应该等待(async/await
或callback
)直到将数据保存到数据库,但是例如您只想记录一个操作而无需返回前端,则可以异步保存它
答案 2 :(得分:0)
是的,由于nodejs的工作方式,您应该将数据异步保存到db。如果您等待数据库同步回答,则nodejs会阻止事件循环,并且不会处理来自客户端的新请求。但是,如果您的业务逻辑依赖于您应该将答案从db返回给客户端的事实,则应该同步进行,并考虑解决方法或选择其他运行时,如果这会成为问题。