如何在KOA 2中编写异步中间件

时间:2017-01-09 07:14:39

标签: javascript node.js async-await koa koa2

我想解决一个承诺,然后在Koa 2中渲染一个类似的视图。

async function render(ctx, next) {
  // wait for some async action to finish
  await new Promise((resolve) => { 
   setTimeout(resolve, 5000)
  })
  // then, send response
  ctx.type = 'text/html'
  ctx.body = 'some response'
  await next()
}

然而,当我这样做时,服务器不发送任何响应(浏览器一直等待响应,并超时)。我做错了什么?

3 个答案:

答案 0 :(得分:2)

我意识到我已经在这里待了几个月,但我刚才偶然发现了同样的问题并发现为了让一个给定的中间件能够等待异步执行,所有前面的中间件都必须await next(),而不仅仅是next()。确保事后证实这一点很明显。

我希望这会有所帮助。

答案 1 :(得分:0)

所以,我拿了你的代码并创建了一个小应用程序:

const Koa = require('koa');
const app = new Koa();

async function render(ctx, next) {
  // wait for some async action to finish
  await new Promise((resolve) => { 
   setTimeout(resolve, 5000)
  })
  // then, send response
  ctx.type = 'text/html'
  ctx.body = 'some response'
  await next()
}

app.use(render);

app.listen(3000);

这种方式开箱即用......无需更改。看来,你“使用”render函数的方式似乎不正确。

答案 2 :(得分:0)

我编写中间件的方式与@Sebastian非常相似:

const Koa = require('koa');
const app = new Koa();

const render = async(ctx, next) {
    // wait for some async action to finish
    await new Promise((resolve) => { 
        setTimeout(resolve, 5000)
    });
    // then, send response
    ctx.type = 'text/html';
    ctx.body = 'some response';

    await next();
}

app.use(render);
....

希望它可以帮到你