Как правильно использовать для await eslint (запрос последовательности)

#javascript #node.js #eslint

#javascript #node.js #eslint

Вопрос:

Я хочу вставить данные в БД, проблема в том, что когда я перебираю массив, я хочу проверить, имеет ли он то же имя пользователя, я хочу поместить данные в этот объект в БД, иначе я хочу создать новый, я пытаюсь использовать Promise all , reduce, он работает параллельно, но это работаеткогда я использую цикл for await, но eslint сказал, что в любом случае нет ограниченного synctax, чтобы исправить его в формате eslint

вот мой пример данных

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

я ожидаю, что данные в БД будут

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

Вот с чем он работает для цикла, но 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"
      }
    
}
 

Комментарии:

1. В чем ошибка?

2. нет ограничений на синхронизацию с es lint, когда я использую для await. цикл

3. Почему вы используете for await ? data не является асинхронным генератором. Просто используем обычный for...of цикл.

4. Я не могу себе представить, что no-restricted-syntax это включено по умолчанию. Какова ваша конфигурация eslint?

5. Похоже, что эта конфигурация исходит из airbnb-base then: github.com/airbnb/javascript#iterators-and-generators .

Ответ №1:

Похоже, что правило ограниченного синтаксиса исходит из расширяемой конфигурации 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 });
  // ...
}
 

Ответ №2:

Если вы используете mongoose / MongoDB, вы можете решить все это просто так:

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

 

Комментарии:

1. Это запускает все параллельно (чего OP не хочет) и не позволяет ожидать завершения всех итераций.

Ответ №3:

Практически, я бы сначала просто отключил eslint для этой строки.

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

Если это используется чаще, то было бы лучше настроить eslint, чтобы разрешить это. См. https://eslint.org/docs/rules/no-restricted-syntax

Комментарии:

1. сейчас я использую подобное, но просто хочу знать, есть ли у них какой-нибудь правильный способ изменить мой код

2. Я думаю, что это просто отлично, и я бы изменил конфигурацию Eslint на alllow, но я уверен, что есть и другие мнения.