如何以正确的方式使用for await esint(序列查询)



我想在DB中插入一个数据,问题是当我循环数组时,我想检查它是否有相同的用户名,我想把数据推送到DB中的那个对象中,否则我想创建新的,我试着使用Promise all,reduce,它并行运行,但当我使用等待循环时它是有效的,但eslint说没有限制的synctax无论如何都更适合将其修复为eslint格式的

这是我的示例数据

const data = [
{
username: "11"
code:["22"]
},
{
username: "11"
code:["23"]
}
]

我期望数据库中的数据是

const dataInDB = [
{
username: "11"
code:["22","23"]
},
]

以下是它对循环的处理方法,但esint显示错误

for await (const item of data) {
const findUser = await User.findOne({ username: item.username });
if (findUser == null) {
// add new data 
} else {
// push data code into findUser
}

以下是我尝试使用Promise的所有内容,但似乎数据是并行添加的,如果其他条件[esint没有以这种方式显示错误]

await Promise.all(data.map(async (item) => {
const findUser = await User.findOne({ username: item.username });
if (findUser == null) {
//add into db
} else {
//push data
}
}));

这是我的eslint配置

"env": {
"browser": true,
"commonjs": true,
"es2021": true
},
"extends": [
"airbnb-base"
],
"parserOptions": {
"ecmaVersion": 12
},
"rules": {
"no-param-reassign": ["error", { "props": false }],
"no-underscore-dangle": "off"
},
"globals": {
"__basedir": "writable"
}

}

看起来受限语法规则来自您正在扩展的airbnb配置:https://github.com/airbnb/javascript#iterators-和发电机。如果您真的不想调整配置或添加异常,我相信您应该能够使用正常的for循环:

for (let i = 0; i < data.length; i++) {
const item = data[i];
const findUser = await User.findOne({ username: item.username });
// ...
}

如果您使用mongoose/mongoDB,您可以简单地通过以下方式解决整个问题:

data.forEach(e=>{
User.findOneAndUpdate({username:e.username}, {$push:{code:e.code}})
.then(data=>console.log(data))  
.catch(err=>console.log(err)) 
})

实际上,我首先会禁用这一行的esint。

// eslint-disable-next-line
for await (const item of data) {

如果更多地使用它,那么最好将esint配置为允许这样做。看见https://eslint.org/docs/rules/no-restricted-syntax

最新更新