Intellij Idea warning - "Обещанное возвращение проигнорировано" с помощью aysnc/wait

Я использую Express.js в своем коде с Node.js v7.3. В этом я создал User Router, который перенаправляет запросы на мой User Controller.

Я использую async/await внутри User Controller для выполнения асинхронных вызовов. Проблема в том, что IntelliJ дает мне предупреждение, говорящее, что

Обещание, возвращенное из login(), игнорируется.

Дело в том, что я даже ничего не возвращаю из метода login().

Здесь код -

UserRouter.js

router.post('/login', function (req, res, next) {
    userController.login(req, res); // I get the warning here
});

UserController.js

exports.login = async function (req, res) {
    try {
        const verifiedUser = await someFunction(req.body.access_code);
        let user = await User.findOrCreateUser(verifiedUser);
        res.status(200).send(user);
    }
    catch (err) {
        res.status(400).send({success: false, error: err});
    }
};

Если я напишу один и тот же метод входа, используя собственный promises, то я не получу это предупреждение. Я понимаю что-то неправильно здесь или IntelliJ по вине?

EDIT -

Благодаря @Stephen я понимаю, что функция async возвращает обещание, но не лучше ли Intellij идентифицировать, что ничего не возвращается из асинхронной функции и не отображает это предупреждение, потому что когда я цепляю .then() после функции login(), он предоставляет объект undefined в результат then. Это означает, что если мы не возвращаем что-то из асинхронной функции явно, возвращается undefined?

Ответ 1

Дело в том, что я даже ничего не возвращаю из метода login().

Функция, объявленная async, возвращает Promise по определению. Смотрите, например, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Однако предупреждение IDEA - это только проверка. Вы можете нажать "alt-enter, right" в предупреждении и изменить уровень проверки, чтобы предупреждение исчезло. Проверка находится в категории "JavaScript → Вероятные ошибки" и называется "Результат вызова метода, возвращающего обещание, игнорируется".

Ответ 2

Функция userController.login() возвращает обещание, но вы ничего не делаете с результатом обещания, используя функцию then().

Например:

userController.login(req, res).then(() => {
    // Do something after login is successful.
});

или в синтаксисе ES2017:

await userController.login(req, res);

Если вы на самом деле ничего не хотите делать, я думаю, вы можете просто игнорировать предупреждение. Предупреждение в основном происходит потому, что не использовать функцию then() в обещании, как правило, является запахом кода.

Ответ 3

если вы действительно сошли с ума, как я, и then() не требуется, но вам нужно предупреждение, чтобы уйти, возможное решение:

functionWithAsync.error(console.error);

Ответ 4

Еще один способ избавиться от предупреждения - определить пустое значение then():

userController.login(req, res);//<- Get the warning here

userController.login(req, res).then();//<- No warning