koa-router 是否真的能正常使用 async/await ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DoraJDJ
V2EX    Node.js

koa-router 是否真的能正常使用 async/await ?

  •  1
     
  •   DoraJDJ 2017-04-15 23:22:34 +08:00 5844 次点击
    这是一个创建于 3176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚才试着用 Koa 2 写个应用,结果在使用 async/await 的时候有点迷糊。

    我给自己的应用用 koa-router 这个中间件写了个路由,然后从远程 API 服务器上获取信息:

    router.get('/bili/:vid', async (ctx, next) => { try { var result = await services.bilibili.video(this.params.vid); ctx.body = result; } catch (e) { ctx.body = e; } }); 

    但是在运行测试的时候发现它返回的内容直接是一个空对象,什么都没有,错误也没报:

    HTTP GET: /bili/1145140 Response: {} 

    后来我不使用 router 中间件直接 app.use 发现功能一切正常:

    app.use(async (ctx) => { ctx.body = await services.bilibili.video(1145140); }); 
    Response: {"tid":59,"typename":"演奏",...(如下略过) 

    我确定在远程服务器上获取信息的函数返回的是 Promise 对象:

    function getVideoInfo(vid) { return new Promise((resolve, reject) => { var reqmap = new Map(); reqmap.set('appkey', config.biliapi.appkey); reqmap.set('id', vid); reqmap.set('page', 1); ...(如下略过) 

    发现问题后我尝试在 Google 和 GitHub 上查找相关关键词但都没有找到类似的案例,不知道是什么问题造成的。

    Koa 版本是 2.2.0 , Koa router 版本是 7.1.1 。

    第 1 条附言    2017-04-16 00:09:53 +08:00
    老了,不中用了

    是 ctx.params 不是 this.params ,写 Koa 1 代码写中毒了...
    11 条回复    2017-04-16 12:05:24 +08:00
    int64ago
        1
    int64ago  
       2017-04-15 23:42:28 +08:00 via Android
    所以 router 外部逻辑呢(你只贴了内部逻辑)?一起贴出来
    DoraJDJ
        2
    DoraJDJ  
    OP
       2017-04-15 23:52:01 +08:00
    @int64ago
    小的不太了解专业术语,不知道外部逻辑和内部逻辑是什么意思,请见谅。

    const Koa = require('koa');
    const render = require('koa-ejs');
    const koaStatic = require('koa-static');
    const path = require('path');

    const app = new Koa();
    render(app, {
    root: path.join(__dirname, 'views'),
    layout: false,
    viewExt: 'ejs'
    });

    app.use(koaStatic(path.join(__dirname, 'statics'))).use(routers.routes()).use(routers.allowedMethods());

    使用到的中间件也就这些了。
    zbinlin
        3
    zbinlin  
       2017-04-15 23:58:21 +08:00 via Android
    用了 arrow function 后 this 不是 router 实例了
    DoraJDJ
        4
    DoraJDJ  
    OP
       2017-04-15 23:59:34 +08:00
    @zbinlin 刚才把箭头函数打掉了,但返回的内容照样是空对象。
    zbinlin
        5
    zbinlin  
       2017-04-16 00:03:02 +08:00 via Android
    @DoraJDJ 先 use 里那样,直接写死一个 id 试下
    zbinlin
        6
    zbinlin  
       2017-04-16 00:03:40 +08:00 via Android
    @zbinlin s/先 /像
    Mikewu
        7
    Mikewu  
       2017-04-16 00:07:38 +08:00
    你使用 koa-router , await services.bilibili.video(this.params.vid)的参数是 String ,返回结果的是空{},并没有捕获到异常。
    你直接 app.user, await services.bilibili.video(1145140)的参数是 Number ,正确返回结果。
    那是不是你的 services 方法有问题呢? 方便的话贴出来看看。
    或者直接自己打断点 debug 吧, 顺便说下 koa-router@next 是肯定能正常使用 async/await
    DoraJDJ
        8
    DoraJDJ  
    OP
       2017-04-16 00:08:33 +08:00
    @zbinlin 果然我又不中用了...
    刚才写死 id 之后内容获取正常。
    再重新看了下 koa-router 的示例代码,我居然模仿的是旧版本的示例...
    binux
        9
    binux  
       2017-04-16 00:09:35 +08:00
    打 log 啊
    hansnow
        10
    hansnow  
       2017-04-16 08:28:58 +08:00
    遇到过很多次类型情况,让我养成一个习惯:先怀疑自己,再怀疑框架
    songjiaxin2008
        11
    songjiaxin2008  
       2017-04-16 12:05:24 +08:00 via iPhone
    当然可以 https://github.com/solarhell/journey/blob/master/src/routes.ts

    可以在看下 CheckPermission 的写法
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5173 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 07:43 PVG 15:43 LAX 23:43 JFK 02:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86