Javascript: SyntaxError: await is only valid in async function

Viewed 32554

I am on Node 8 with Sequelize.js

Gtting the following error when trying to use await.

SyntaxError: await is only valid in async function

Code:

async function addEvent(req, callback) {
    var db = req.app.get('db');
    var event = req.body.event

    db.App.findOne({
        where: {
            owner_id: req.user_id,
        }
    }).then((app) => {

                let promise = new Promise((resolve, reject) => {
                    setTimeout(() => resolve("done!"), 6000)

                })

               // I get an error at this point 
               let result = await promise;

               // let result = await promise;
               //              ^^^^^
               // SyntaxError: await is only valid in async function
            }
    })
}

Getting the following error:

               let result = await promise;
                            ^^^^^
               SyntaxError: await is only valid in async function

What am I doing wrong?

4 Answers

addEvent is a mixture of async..await and raw promises. await is syntactic sugar for then. It's either one or another. A mixture results in incorrect control flow; db.App.findOne(...).then(...) promise is not chained or returned and thus is not available from outside addEvent.

It should be:

async function addEvent(req, callback) {
    var db = req.app.get('db');
    var event = req.body.event

    const app = await db.App.findOne({
        where: {
            owner_id: req.user_id,
        }
    });

    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("done!"), 6000)
    })

    let result = await promise;
}

Generally plain callbacks shouldn't be mixed with promises. callback parameter indicates that API that uses addEvent may need to be promisified as well.

async/await only works if the immediate function has the async keyword, you need this:

...
    }).then(async app => {   // <<<< here

                let promise = new Promise((resolve, reject) => {
                    setTimeout(() => resolve("done!"), 6000)

                })

               // I get an error at this point 
               let result = await promise;

               // let result = await promise;
               //              ^^^^^
               // SyntaxError: await is only valid in async function
            }
    })

You can use await only inside a function which is async. Also you can await only a piece of code that returns a promise.

Here you are using await inside a different context. Better you use then() here to solve the problem.

await only works if the immediate function that encloses it is async.

Related