Home > Mobile >  Possible race condition Node/Express
Possible race condition Node/Express

Time:10-23

I am trying to understand a case I am running into with my Node/Express application.

Let's say I have the following which is a function called when a specific route is hit:

async function routeThatDoesStuff(req, res, next) {
     doAsyncStuff()

     res.status(200).json({ message: 'Completed' })
}

In this case doAsyncStuff() does database operations on resources that are not critical to send back to the user so theoretically we don't need to await it. However, it seems that this operation does not actually complete unless I put the await in front.

My guess is that this has to do with the event loop etc in Node. That potentially because the route is completing before the doAsyncStuff() completes, the function doesn't actually complete because Node terminated it prematurely.

My big question is how Node handles async children function execution when parent functions have already completed?

CodePudding user response:

An example to show that this should work:

const sleep = (milliseconds, cb) => {
    return new Promise(resolve => setTimeout(() => {
        resolve(cb())
    }, milliseconds))
}

async function routeThatDoesStuff(req, res, next) {
    sleep(5000, () => console.log('done'))

    res.status(200).json({ message: 'Completed' })
}

JSON response is shown immediately, callback is executed after 5 seconds even though the response has been sent.

  • Related