我想使用 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。我需要这个将对象推送到客户端的数组,然后在“发布”方法中调用response.end() ( node js version )
subscribe = (ctx, next) => {
clients.push(ctx.res);
ctx.res.on('close', () => {
clients.splice(clients.indexOf(response), 1);
});
};
最佳答案
Koa 中间件(和路由)与 Promise 一起工作。如果 promise 解决,则路由被视为“完成”,并且响应将发送到客户端。
如果您没有返回 promise (或使用异步函数),中间件将被视为立即执行并结束。当您调用 ctx.res.end()
时,基本上已经太晚了。
那么如何告诉 koa 不要自动结束请求呢?您可以通过发送稍后解决的 promise 来做到这一点。
下面是一个中间件的示例,它发回一个永远不会解析的 promise :
const myMw = ctx => {
return new Promise( () => {});
}
鉴于您正在从express迁移到koa(很棒的选择!),您不应该尝试完全采用express中完全相同的模式。长轮询确实非常适合 promise 优先的解决方案。
我强烈建议您对所有事情都使用 Promise。如果一个客户端向所有其他客户端“发布”一条消息,它应该会导致一堆 promise 得到解决。
关于node.js - 如何访问 koa.js 中的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54188045/