web-dev-qa-db-fra.com

Avertissement Idée intelligente - "La promesse retournée est ignorée" avec async/wait

J'utilise Express.js dans mon code avec Node.js v7.3. En cela, j'ai créé un User Router qui transfère les demandes à mon User Controller.

J'utilise async/wait dans le User Controller pour faire des appels asynchrones. Le problème est que IntelliJ me donne un avertissement disant que 

La promesse renvoyée par login () est ignorée.

Le problème est que je ne retourne même rien de la méthode login().

Voici le code - 

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});
    }
};

Si j'écris la même méthode de connexion en utilisant des promesses natives, je ne reçois pas cet avertissement. Est-ce que je comprends quelque chose qui ne va pas ou IntelliJ est-il en faute?

MODIFIER -

Grâce à @Stephen, je comprends qu'une fonction asynchrone retourne une promesse, mais ne serait-il pas préférable qu'Intellij identifie que rien n'est renvoyé par la fonction async et ne montre pas cet avertissement, car lorsque je chaîne un .then() après la fonction login() , il fournit un objet undefined dans le résultat alors. Cela signifie que si nous ne renvoyons pas explicitement quelque chose de la fonction asynchrone, alors indéfini est renvoyé?

26
Jyotman Singh

Le problème est que je ne retourne même rien de la méthode login ().

Une fonction déclarée "asynchrone" renvoie une promesse par définition ..__ Voir par exemple https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Cependant, l'avertissement IDEA n'est qu'une inspection. Vous pouvez appuyer sur "alt-enter, right" sur l'avertissement et modifier le niveau d'inspection pour que l'avertissement disparaisse. L'inspection est dans la catégorie "JavaScript -> Bogues probables" et est nommée "Résultat du retour de l'appel de méthode une promesse est ignorée ".

22
Stephen Friedrich

La fonction userController.login() renvoie une promesse, mais vous ne faites rien avec le résultat de la promesse en utilisant sa fonction then().

Par exemple:

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

ou dans la syntaxe ES2017:

await userController.login(req, res);

Si vous ne voulez vraiment rien faire, je suppose que vous pouvez simplement ignorer l'avertissement. L'avertissement est généralement présent car ne pas utiliser la fonction then() sur une promesse est généralement une odeur de code.

24
Robba

si vous êtes vraiment maniaque comme moi et que la fonction then() n'est pas obligatoire, mais que vous avez besoin que l'avertissement disparaisse, une alternative est la suivante:

functionWithAsync.error(console.error);
1
winter