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

How to use for await in proper way eslint ( sequence query)

我想在数据库中插入数据,问题是当我循环数组时我想检查它是否具有相同的用户名我想将数据推送到数据库中的那个对象否则我想创建新的,我尝试使用 Promise all , reduce ,它是 运行 并行但是当我使用 for await 循环时它是工作的但是 eslint 说无论如何没有限制的语法将它修复为 eslint 格式

这是我的示例数据

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

我期望数据库中的数据是

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

这是它与 for 循环一起使用的内容,但 eslint 显示错误

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 all 的方法,但似乎数据是并行添加的,它没有进入 if else 条件 [eslint 没有以这种方式显示错误]

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"
      }
    
}

实际上,我会首先为这一行禁用 eslint。

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

如果这个用的比较多,那么最好配置eslint允许这个。参见 https://eslint.org/docs/rules/no-restricted-syntax

如果你使用的是mongoose/mongoDB,你可以这样简单地解决整个问题:

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

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

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