koa2 ctx.body 在 mysql query的回调函数中无法赋值。

koa2 ctx.body 在 mysql query的回调函数中无法赋值。

由于在 koa2中 关于 请求的函数 使用了async 和 await ,所以当 执行完数据库操作之后,将返回的数据在回调函数中 赋值给 ctx.body 时,无法赋值。

在 async 函数内,使用await来执行异步操作,而await 会直接解析 Promise 的resolve 或者reject 中的值。对于有回调函数的操作,并不会被 async 等待,而直接执行,所以在回调函数中书写的ctx.body = results 操作时 页面已经返回,且并未获取到数据库返回的值。所以页面会显示notFOUND。

解决方法是  将 query 函数外部包含一个 new Promise 函数,通过promise 来 resolve (results),来配合await 操作完成 异步操作。而 async 与 await 的作用是为了将异步操作转换为同步操作,所以 ctx.body 赋值 操作 可以写在  await 操作后边。这样就可以成功返回正确的数据。

复制代码

const connection = require('./mysql');
const query = function (sql,arg) {
    return new Promise((resolve, reject) => {
        connection.query(sql, arg, function (error, results) {
            if(error){
                reject(error);
            }else{
                resolve(results)
            }
        });
    })
}

复制代码

var fn_hello = async (ctx, next) => {
    var name = ctx.params.name;
    let results = await query('SELECT * FROM first_grade WHERE grade_age=?',[12]);
    ctx.response.body = env.render('hello.html', { name: name, age: 12, data: results });
};

这样就成功了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值