10
app.use(async function(req, res, next) {
    try {
        var myres = await new Promise((resolve, reject) => {
            mysql_connection.query("select * from Users;", (err, rows) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(rows);
                }
            });
        });
    } catch (error) {
        console.log(error);
    }
});

Question is. using async function to be able to use await for DB queries is ok? i am afraid that it can cause some problems on expressjs side.

1
  • 1
    Are you ignoring myres on purpose? Otherwise, you can simply call next with error, if any (I am assuming you are already aware of this). Commented Jul 26, 2018 at 9:31

4 Answers 4

25

async..await is syntactic sugar for promises, and a promise is just a pattern that relies on callbacks. The use of async functions is acceptable wherever they are supported by the environment. async..await is supported since Node.js 7.6.0.

async function always returns a promise. As long as this implicit return value doesn't cause problems, it's perfectly fine everywhere, including Express. It doesn't matter whether it's used for database queries or anything else.

Unless API supports promises, errors should be entirely handled in async function. Function body should be wrapped with try..catch to rule out unhandled rejections which may result in exceptions in future Node versions.

The original code contains no next calls and just suppresses an error. As a rule of thumb, async middleware should be structured like that:

app.use(async function(req, res, next) {
    try {
        ...
        next();
    } catch (error) {
        next(error);
    }
});
Sign up to request clarification or add additional context in comments.

3 Comments

estus why does the code inside catch contain next? as you mentioned The original code contains no next calls and just suppresses an error. note: if I don't use next, it still throws unhandle Promise warning. Also, I went through this question: stackoverflow.com/questions/13133071/…
Also If you could a minute or two on this question as well? stackoverflow.com/questions/53941672/… (will be great help)
Suppressing an error is rarely a good idea. In case of a middleware that is supposed to send a response (this isn't shown in OP), doing nothing would result in no response and request timeout. next delegates the error to Express error handler. It's a common way to handle errors in Express. You can use res.status(400).send(...) instead of next(err) in case you have more specific idea how to handle this error. if I don't use next, it still throws unhandle Promise warning. - you're likely doing something wrong.
10

Async await can be used with no problem for DB queries. You could use try catch however there is a more elegant solution which allows you to use the error handling middleware which express offers:

You wrap your middleware with this function:

const asyncMiddleware = fn =>
  (req, res, next) => {
    Promise.resolve(fn(req, res, next))
      .catch(next);
  };

Then you can use it in the following manner:

const asyncMiddleware = require('./utils/asyncMiddleware');

router.get('/', asyncMiddleware(async (req, res, next) => {
    /* 
      if there is an error thrown in getUserFromDb, asyncMiddleware
      will pass it to next() and express will handle the error;
    */
    const user = await getUserFromDb({ id: req.params.id })
    res.json(user);
}));

If an error is thrown the control will be handed over to the error handling middleware which is middlware which has four arguments like this:

app.use(function (err, req, res, next) {
   // your error code
})

1 Comment

hi thanks for your answer, could you please explain how does a wrapper works :) i am not a pro in javascript so reading that code is a bit confusing
2

You also can import on your server.ts or server.js the https://www.npmjs.com/package/express-async-errors that handle async errors on express

yarn add express-async-errors

And import it import 'express-async-errors'; on your main file.

Comments

1

Using async function to be able to use await for DB queries is totally okay. But try to embed that code in try and catch block so you can catch the exceptions.

2 Comments

But ne thing which left unanswered, it will not cause some unpredictable behavior on express side ?
It won't . Please have a look on this blog: medium.com/@Abazhenov/… I hope it helps.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.