javascript - 当调用者不期望响应时使用`await`
问题描述
我有一个非常简单的快速应用程序,它将从客户端接收到的信息存储到数据库中,几乎没有任何处理。一些简化的代码来说明这一点:
app.post(ANALYTICS_ENDPOINT, async (req, res) => {
try {
await insertToDB(req.body)
res.status(204).send();
} catch (err) {
logger.error(err);
res.status(500).send();
}
});
此应用程序部署到谷歌云运行并每秒处理大量请求。我们注意到的是,await
从路由中删除关键字允许每个容器处理更多请求,但缺点是不捕获错误 - 所以客户端总是会收到一个204
.
在此使用 await 的另一个用途是在insertToDB
函数中再次简化,如下所示:
const insertToDB = async (row) => {
await dbClient.insert(row);
}
正如您在此处看到的,我们也在使用此操作,await
因为此操作返回一个 Promise。
所以问题是,当调用者不期望响应时,我们是否应该等待?是否可以避免这些等待,我们可以在我们的应用程序上处理更多的吞吐量?
编辑:这里有一个类似的问题。然而我认为这是不同的,因为我最感兴趣的是理解为什么删除await
允许我每秒处理 2/3 倍的请求数。
解决方案
您应该等待,因为您的 db 调用是async
,因此您必须等待插入完成,然后再返回客户端。
您可以简单地使用承诺解决方案来更简洁明了:
app.post(ANALYTICS_ENDPOINT, async (req, res) => {
insertToDB(req.body)
.then(() => res.status(204).send())
.catch(() => res.status(500).send());
});
推荐阅读
- json - 如何使用 kotlinx 在 Kotlin 上使用未知键迭代 JsonElement?
- python - 如何将 SQL 中的一列数据转换为 python 中的列表?
- python - 如何在张量流中逐行旋转张量?
- azure-devops - DevOps:如何在拉取请求中正确使用分支过滤器
- nginx - nginx - OpenShift pod 中未应用日志格式
- javascript - 正则表达式或运算符的奇怪之处
- c# - 在 C# 中以编程方式将 .crt + .key 文件转换为 X509Certificate2
- r - 使用向量中的值在数据框中添加行
- node.js - CORS 错误:“响应中的 'Access-Control-Allow-Origin' 标头的值不能是通配符 '*'...”
- wordpress - 将自定义 wordpress 文件放在子主题文件夹中并让 get_header 和 get_footer 工作