Thursday, 8 June 2017

How to make koa wait for a node-sqlite3 result?

I am using Koa2 with node-sqlite3 and am running into an issue where I can't get Koa to wait for the db call to return before returning the body

Simplified example:

app.get('/:name/:nickname', function (ctx) {
    var queryParams = [ctx.params.name, ctx.params.nickname]
    db.get("SELECT nickname FROM users WHERE name = ? AND nickname = ?", queryParams, function (err,result) {

        if (result == null) {
            console.log('Add new nickname')
            db.run("INSERT INTO users (name, nickname) VALUES (?, ?)", queryParams)
            ctx.body = 'Inserted user ' + ctx.params.nickname
        } else {
            console.log('Return existing nickname')
            ctx.body = result.nickname
        }
    })
    console.log('This is after')
})

Which always returns something like:

This is After
Add new nickname

How can I get koa to wait for the sqlite result?

edit

My apologies, it is a simple matter of a promise:

app.get('/:name/:nickname', async (ctx, next) => {
    await new Promise((resolve, reject) => {
        var queryParams = [ctx.params.name, ctx.params.nickname]
        db.get("SELECT nickname FROM users WHERE name = ? AND nickname = ?", queryParams, function (err,result) {
            if (result == null) {
                // Add the name if not in DB
                db.run("INSERT INTO users (name, nickname) VALUES (?, ?)", queryParams)
                ctx.body = 'Inserted user ' + ctx.params.nickname
            } else {
                // Return nickname if in DB
                ctx.body = row.nickname
            }
            resolve()
        })
    })

    console.log('This is after')
})



via waffl

No comments:

Post a Comment