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

标签 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);

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

相关文章:

javascript - 来自 Firefox 的错误 : MIME type (“text/plain” ) mismatch (X-Content-Type-Options: nosniff)

node.js - 模拟 Typeorm QueryBuilder

node.js - 使用加密的 cookie 和 session 存储来保护请求

java - Firebase/Firestore 聊天应用程序的数据模型

javascript - 如何使用 Socket.io 和 Node.js 开发大型聊天应用程序

mysql - SSRS 是否是为 MSSQL 过程创建用户界面以检索后端数据的理想工具?

javascript - 在 node.js 中重新映射 require() 的本地路径

javascript - 无法使用 google kms 生成有效的 jwt 签名

ios - Google App Engine 和 Socket.IO 上的移动聊天应用程序

Java应用程序设计问题