2016-12-22 33 views
13

我使用Express.js在我的代碼以Node.js的 7.3版。在此我創建了一個User Router,將請求轉發給我的User ControllerIntelliJ IDEA的警告 - 「無極返回被忽略」與aysnc /等待

我在User Controller內部使用async/await進行異步調用。問題是,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}); 
    } 
}; 

如果我寫了使用原生的承諾才把我不相同的登錄方法沒有得到這個警告。我是否在這裏理解錯誤或IntelliJ有問題?

編輯 -

感謝@Stephen,據我所知,一個異步函數返回的希望,但是,那豈不是更好,如果確定的IntelliJ,沒有什麼正在從異步函數返回,並且不顯示該警告,因爲當我在login()函數之後鏈接.then()時,它會在結果中提供undefined對象。這意味着如果我們不明確地從異步函數中返回某個東西,那麼undefined會被返回?

回答

5

事情是我甚至沒有從login()方法返回任何東西。

聲明「async」的函數根據定義返回Promise。 參見例如https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

然而IDEA警告僅是一個檢查。您可以在警告中按「alt-enter,right」並更改檢查級別以使警告消失。 檢查位於「JavaScript - >可能的錯誤」類別中,並被命名爲「返回承諾的方法調用的結果被忽略」。

4

userController.login()函數返回一個承諾,但您沒有對承諾的結果利用其then()函數做任何事情。

例如:

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

或ES2017語法:

await userController.login(req, res); 

如果不真正想做的任何事情在那裏,我想你可以不理會警告。警告大多存在,因爲在承諾上不使用then()函數通常是代碼異味。