Мангуста и сонаркуба - PullRequest
       34

Мангуста и сонаркуба

2 голосов
/ 30 апреля 2019

Мне нравится синтаксис async await, и я часто его использую с mongoose.

Так что в моем проекте много:

const user = await User.findOne({
    _id: req.params.id
})

Что работает так, как ожидалось. Тем не менее, в sonarqube, у меня есть эти ошибки: Refactor this redundant 'await' on a non-promise.

И правило сонаркуба я:

Можно использовать await для значений, которые не являются Обещаниями, но это бесполезный и вводящий в заблуждение. Смысл ожидания - приостановить выполнение до асинхронный код Promise завершен. С чем кроме Обещания ждать нечего.

Это правило поднимает проблему, когда ожидаемое значение гарантированно не является Обещанием.

Пример несовместимого кода

let x = 42;
await x; // Noncompliant

Совместимое решение

let x = new Promise(resolve => resolve(42));
await x;

let y = p ? 42 : new Promise(resolve => resolve(42));
await y;

Я использую Mongo 4.0 и Mongoose 5.3.1

Поскольку я могу использовать синтаксис .then, .catch, я подумал, что имею дело с обещанием, так как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Я не знаю много о SonarQube. Я только что выяснил, SonarQube - это инструмент для проверки качества кода и того, что требуется await только префикс с promises, и там mongoose не получается даже с .then.

Запросы Mongoose не возвращают "полноценное" обещание, даже если они имеют .then(). Поэтому, чтобы получить «полноценное» обещание, вам нужно использовать функцию .exec().

const user = await User.findOne({ _id: req.params.id }).exec()
0 голосов
/ 30 апреля 2019

Как уже упоминалось в комментариях, это ложное срабатывание, точнее предупреждение с ограничениями.

Вы можете либо проигнорировать его, либо добавить его в свой код сразу после оператора импорта:

mongoose.Promise = Promise; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...