我想使用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);
});
};
答案 0 :(得分:0)
Koa中间件(和路由)具有承诺。如果诺言得以解决,则将路由视为“完成”,并将响应发送给客户端。
如果您未返回承诺(或使用异步功能),则认为中间件将立即执行并结束。致电ctx.res.end()
基本上为时已晚。
那么您如何告诉koa不要自动结束请求?您可以通过发送稍后可以解决的承诺来做到这一点。
以下是一个中间件示例,该中间件发回了永远无法解决的承诺:
const myMw = ctx => {
return new Promise( () => {});
}
鉴于您正在从快递迁移到koa(绝佳选择!),您不应该尝试完全采用与快递完全相同的模式。长轮询确实非常适合承诺优先的解决方案。
我强烈建议您对所有事项都使用诺言。如果一个客户向其他每个客户“发布”一条消息,则应该会解决大量的诺言。