javascript - await async - ESLint require-atomic-updates 中的竞争条件错误
问题描述
下面的代码在使用ESLint检查时会导致竞争条件:
let match = false
try {
match = await something()
} catch (err) {
// do something
}
if (match === false) {
// do something
}
编写这段代码的更好方法是什么?
编辑:
let request = ctx.request.body || {}
let password = request.password
let match = false
try {
match = await bcrypt.compare(password, 'xxxxx')
} catch (err) {
ctx.throw(401, err)
}
if (match === false) {
ctx.throw(401, 'invalid password')
}
ctx.body = {
message: 'logged in ok'
}
来自 ESLint 的错误:
可能的竞争条件:可能会根据 require-atomic-updates
ctx.body
的过时值重新分配ctx.body
解决方案
您可以放心地忽略警告:)
ESLint 旨在捕捉这样的事情:
let value = 0;
async function race() {
value += await Promise.resolve(1);
console.log(value);
}
race(); race();
在这种情况下,在堆栈上进行记忆,race
sa tick,然后回写到. 由于其他代码同时运行,可能已经更改,然后更新可能会关闭......它不是原子的。value
await
value
value
但是,在您的情况下,您读取ctx.request.body
和写入ctx.body
,因此没有非原子更新。此外,可能没有其他中间件同时ctx
访问相同的,因此不能有任何并发修改。因此,在您的情况下,这是一个误报,甚至可以怀疑这是否是肯定的(这可能是 ESLint 中的错误)。
推荐阅读
- azure-active-directory - 在 Office Scripts 外部提取请求中注入(自己的)Azure Ad id_token
- python - 无法使用 nc (netcat) 传输文件
- mysql - MySQL MATCH AGAINST 不返回结果
- python - 有效地更新同一字段多个对象django
- javascript - datalist selected value is "null" in the sheet
- python - 更新实际图像后 Django Imagekit 不生成缩略图
- postgresql - 在 PostgreSQL 中从 JSON 迁移到 JSONB 是否安全
- kotlin - 如何将kotlin中的密封类转换为java
- swagger-2.0 - 从 openapi 生成的模型可以有自定义和多个路径吗?
- python - 完成屏幕测量后生成新屏幕,无需重启树莓派