我想用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。我需要它来将对象推送到客户端的数组中,然后在'publish‘方法(node js version)中调用response.end()。
subscribe = (ctx, next) => {
clients.push(ctx.res);
ctx.res.on('close', () => {
clients.splice(clients.indexOf(response), 1);
});
};发布于 2019-01-15 03:43:45
Koa中间件(和路由)使用promises。如果promise解析,则认为路由“完成”,并将响应发送到客户端。
如果您没有返回promise (或使用异步函数),则认为中间件会立即执行并结束。当你调用ctx.res.end()的时候,基本上已经太晚了。
那么,如何告诉koa不要自动结束请求呢?您可以通过发送稍后解决的承诺来做到这一点。
下面是一个中间件的例子,它发回一个永远不会解决的承诺:
const myMw = ctx => {
return new Promise( () => {});
}假设您正在从express迁移到koa (很好的选择!)您不应该尝试完全采用express中完全相同的模式。长轮询非常适合promise-first解决方案。
我强烈建议你在任何事情上都使用promises。如果一个客户‘发布’一条消息给每个其他客户,它应该会导致一堆承诺的解析。
https://stackoverflow.com/questions/54188045
复制相似问题