koa无法获取接口内容

.query可以获取接口可以直接console出来,ctx.body无法得到console出来的内容

router.all('/publ/tongji',async(ctx,next)=>{
    //ctx.body = ctx;
    await db.query("SELECT * FROM `class`;",
        (err,data)=>{
            if(err){
                console.log(err);
                ctx.body = err;
            }
            else{
                console.log(data);
                ctx.body = data;
            }
        });
    next();
});

上端代码中ctx.body无法获取数据 但是console.log能够获取数据。

router.all('/publ/tongji',async(ctx,next)=>{
    //ctx.body = ctx;
    ctx.body = await db.query("SELECT * FROM `class`;",
        (err,data)=>{
            if(err){
                //console.log(err);
                return err;
            }
            else{
                //console.log(data);
                return data;
            }
        });
    next();
});

上边方法依然不行,真难受!!!希望大神指教

阅读 3.3k
4 个回答
  1. 将回调包装成Promise

你的代码

db.query("SELECT * FROM `class`;",
        (err,data)=>{
            if(err){
                //console.log(err);
                return err;
            }
            else{
                //console.log(data);
                return data;
            }
        });

改为

function getData() {
    return new Promise((resolve,reject)=>{
        db.query("SELECT * FROM `class`;",(err,data)=>err?reject(err):resolve(data))
    });
}

调用

router.all('/publ/tongji',async(ctx,next)=>{
    ctx.body = await getData();
});

用了async还要写callback?

新手上路,请多包涵

return next();

建议题主深入了解下Promise,async/await。
还有,你的next最好这样写 await next()。养成习惯比较好。
给你一个非常规写法:

router.all('/publ/tongji',async(ctx,next)=>{
    //ctx.body = ctx;
    db.query("SELECT * FROM `class`;", (err,data)=>{
        if(err){
            console.log(err);
            ctx.body = err;
        }
        else{
            console.log(data);
            ctx.body = data;
        }
        next();
    });
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题