• 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 });
    };

    这样就成功了。

  • 相关阅读:
    webjars管理静态资源
    SpringCloud踩坑日记
    ELK日志搜索平台搭建
    新硬盘挂载到目录后目录原先数据消失解决办法
    nginx安装缺少依赖记录
    SpringCloud踩坑日记
    .bashrc配错刷新导致linux基础命令不能用修复
    nginx超时时间配置
    nginx日志切分shell脚本
    2019.10.10 实习日记
  • 原文地址:https://www.cnblogs.com/RoadAspenBK/p/10167794.html
Copyright © 2020-2023  润新知