web-dev-qa-db-ja.com

Intellij Idea警告-async / awaitで「返された約束は無視されます」

コードでNode.jsv7.3でExpress.jsを使用しています。これで、リクエストをUser Routerに転送するUser Controllerを作成しました。

非同期呼び出しを行うために、User Controller内でasync/awaitを使用しています。問題は、IntelliJが私に次のような警告を与えることです

Login()から返された約束は無視されます。

問題は、login()メソッドから何も返さないことです。

コードは次のとおりです-

serRouter.js

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

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

ネイティブPromiseのみを使用して同じログインメソッドを記述した場合、この警告は表示されません。ここで何か間違っていることを理解していますか、IntelliJに障害がありますか?

編集-

@Stephenのおかげで、非同期関数が約束を返すことを理解していますが、非同期関数から何も返されていないことをIntellijが識別し、.then()login()関数の後に、undefinedオブジェクトをthen結果に提供します。非同期関数から何かを明示的に返さない場合、未定義が返されますか?

45
Jyotman Singh

問題は、login()メソッドから何も返さないことです。

「async」と宣言された関数は、定義によりPromiseを返します。たとえば https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function を参照してください

ただし、IDEA警告は単なる検査です。警告で「alt-enter、右」を押し、検査レベルを変更して警告を消すことができます。検査は「JavaScript-> Probable bugs」カテゴリにあり、「Promiseを返すメソッド呼び出しの結果は無視されます」という名前が付けられています。

38

userController.login()関数はpromiseを返しますが、そのthen()関数を利用することにより、promiseの結果に対して何もしていません。

例えば:

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

またはES2017構文:

await userController.login(req, res);

実際にそこで何もしたくない場合は、警告を無視してもかまいません。 Promiseでthen()関数を使用しないことは通常コードのにおいであるため、警告はほとんどあります。

30
Robba

私のように本当にman病で、then()は必要ないが、消えるには警告が必要な場合、考えられる解決策は次のとおりです。

functionWithAsync.error(console.error);
5
winter

警告を取り除く別の方法は、空のthen()を定義することです:

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

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

3
Alejandro Silva