gpt4 book ai didi

node.js - 如何访问 koa.js 中的响应

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:12 24 4
gpt4 key购买 nike

我想使用 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);

我无法在代码的下一部分中访问 c​​tx.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com