我在 Node.js v7.3的代码中使用 Express.js 。在此,我创建了一个User Router
,将请求转发给我的User Controller
。
我在User Controller
内使用async / await来进行异步调用。问题是IntelliJ给了我一个警告说
忽略从login()返回的Promise。
问题是我甚至没有从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,我知道async函数会返回一个promise,但如果Intellij发现没有从async函数返回任何内容并且没有显示该警告,因为当我链接{{{ 1}}在.then()
函数之后,它在then结果中提供了一个login()
对象。这意味着如果我们没有显式地从异步函数返回一些东西,那么会返回undefined吗?
答案 0 :(得分:28)
问题是我甚至没有从login()方法返回任何内容。
声明为“async”的函数按定义返回Promise。 请参阅示例this
然而,IDEA警告只是一次检查。您可以在警告上按“alt-enter,right”并更改检查级别以使警告消失。 检查位于“JavaScript - >可能的错误”类别中,并命名为“返回承诺的方法调用结果被忽略”。
答案 1 :(得分:25)
userController.login()
函数会返回一个承诺,但您不会使用其then()
函数对承诺的结果做任何事情。
例如:
userController.login(req, res).then(() => {
// Do something after login is successful.
});
或ES2017语法:
await userController.login(req, res);
如果你真的不想在那里做任何事情,我想你可以忽略这个警告。警告主要在那里,因为在承诺上不使用then()
函数通常是代码气味。
答案 2 :(得分:5)
我在NodeJ中使用try{} catch(e){}
,发现仅在函数末尾添加Error()
即可解决警告。
完整代码:-
someArray.forEach(async (arrayValue) => {
try {
const prodData = await myAsyncFunc(arrayValue);
} catch(e) {
console.error(`Error: ${e}`);
}
}, Error());
答案 3 :(得分:4)
如果您真的像我一样狂躁,并且不需要then()
,但是您需要警告消失,那么可以选择以下替代方法:
functionWithAsync.error(console.error);
答案 4 :(得分:2)
如果您只是想为任何 JetBrains 产品关闭此警告。前往
Preferences > Inspections > JavaScript and TypeScript | Async code and promises | Result of method call returning a promise is ignored
并关闭设置。
答案 5 :(得分:1)
摆脱警告的另一种方法是定义一个空的then()
:
userController.login(req, res); // <- Get the warning here
userController.login(req, res).then(); // <- No warning
答案 6 :(得分:1)
router.post('/login', function (req, res, next) {
void userController.login(req, res); // I get the warning here
});
您应该使用“ void”运算符。