如何在koa.js中访问响应

时间:2019-01-14 19:36:29

标签: node.js chat backend long-polling koa

我想使用koa.js重写长时间轮询的聊天记录(例如here)。但是我遇到了一个问题:

const app = new Koa();
const router = new Router();

router.get('/', homePage)
.get('/subscribe', subscribe)
.post('/publish', publish)

app
.use(router.routes())
.listen(3000);

我无法在代码的下一部分中访问ctx.response。我需要这样做将对象推送到客户端的数组,然后在“发布”方法(node js version)中调用response.end()

subscribe = (ctx, next) => {
  clients.push(ctx.res);
  ctx.res.on('close', () => {
    clients.splice(clients.indexOf(response), 1);
  });
};

1 个答案:

答案 0 :(得分:0)

Koa中间件(和路由)具有承诺。如果诺言得以解决,则将路由视为“完成”,并将响应发送给客户端。

如果您未返回承诺(或使用异步功能),则认为中间件将立即执行并结束。致电ctx.res.end()基本上为时已晚。

那么您如何告诉koa不要自动结束请求?您可以通过发送稍后可以解决的承诺来做到这一点。

以下是一个中间件示例,该中间件发回了永远无法解决的承诺:

const myMw = ctx => {
  return new Promise( () => {});
}

鉴于您正在从快递迁移到koa(绝佳选择!),您不应该尝试完全采用与快递完全相同的模式。长轮询确实非常适合承诺优先的解决方案。

我强烈建议您对所有事项都使用诺言。如果一个客户向其他每个客户“发布”一条消息,则应该会解决大量的诺言。