コードで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結果に提供します。非同期関数から何かを明示的に返さない場合、未定義が返されますか?
問題は、login()メソッドから何も返さないことです。
「async」と宣言された関数は、定義によりPromiseを返します。たとえば https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function を参照してください
ただし、IDEA警告は単なる検査です。警告で「alt-enter、右」を押し、検査レベルを変更して警告を消すことができます。検査は「JavaScript-> Probable bugs」カテゴリにあり、「Promiseを返すメソッド呼び出しの結果は無視されます」という名前が付けられています。
userController.login()
関数はpromiseを返しますが、そのthen()
関数を利用することにより、promiseの結果に対して何もしていません。
例えば:
userController.login(req, res).then(() => {
// Do something after login is successful.
});
またはES2017構文:
await userController.login(req, res);
実際にそこで何もしたくない場合は、警告を無視してもかまいません。 Promiseでthen()
関数を使用しないことは通常コードのにおいであるため、警告はほとんどあります。
私のように本当にman病で、then()
は必要ないが、消えるには警告が必要な場合、考えられる解決策は次のとおりです。
functionWithAsync.error(console.error);
警告を取り除く別の方法は、空のthen()
を定義することです:
userController.login(req, res); // <- Get the warning here
userController.login(req, res).then(); // <- No warning