Intellij Idea warning - "Promise returned is ignored" with aysnc/await
Solution 1
The thing is I'm not even returning anything from the login() method.
A function declared "async" returns a Promise by definition. See for example https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
However the IDEA warning is only an inspection. You can press "alt-enter, right" on the warning and change the inspection level to make the warning go away. The inspection is in the "JavaScript -> Probable bugs" category and is named "Result of method call returning a promise is ignored".
Solution 2
The userController.login()
function returns a promise, but you're not doing anything with the result from the promise by utilizing its then()
function.
For example:
userController.login(req, res).then(() => {
// Do something after login is successful.
});
or in the ES2017 syntax:
await userController.login(req, res);
If you don't actually want to do anything there, I guess you can just ignore the warning. The warning is mostly there because not using the then()
function on a promise is usually a code smell.
Solution 3
router.post('/login', function (req, res, next) {
void userController.login(req, res); // I get the warning here
});
You should use "void" operator.
Solution 4
if you are really manic as me and the then()
is not required but you need the warning to go away, a possible solution is:
functionWithAsync.error(console.error);
Solution 5
another way to get rid of the warning is defining an empty then()
:
userController.login(req, res); // <- Get the warning here
userController.login(req, res).then(); // <- No warning
Jyotman Singh
Learning Functional Programming - Node.js and Scala.
Updated on October 16, 2021Comments
-
Jyotman Singh over 2 years
I'm using Express.js in my code with Node.js v7.3. In this I've created a
User Router
which forwards the requests to myUser Controller
.I'm using async/await inside the
User Controller
to do asynchronous calls. The problem is that IntelliJ gives me a warning saying thatPromise returned from login() is ignored.
The thing is I'm not even returning anything from the
login()
method.Here's the 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}); } };
If I write the same login method using native promises only then I don't get this warning. Am I understanding something wrong here or is IntelliJ at fault?
EDIT -
Thanks to @Stephen, I understand that an async function returns a promise but wouldn't it be better if Intellij identifies that nothing is being returned from the async function and doesn't show that warning because when I chain a
.then()
after thelogin()
function, it provides anundefined
object into the then result. It means if we don't return something from the async function explicitly then undefined is returned?