#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, но я уверен, что есть и другие мнения.