【问题标题】:Query a table then stream results to socket.io with knex and postgres查询一个表,然后使用 knex 和 postgres 将结果流式传输到 socket.io
【发布时间】:2016-05-10 01:19:22
【问题描述】:

我想查询一个表并在内容进入时将其写入套接字,以进行更大的查询。 I was reading the documentation for streams。我试图用 socket.io 来实现它。下面是我的/users 路由示例,其中appexpress 的实例,iosocket.io 的实例。

module.exports = function (app, io) {
  app.get('/users', function (req, res, next) {
    const limit = req.queryParams.limit || 100;
    const stream = req.db.select('*').from('users').limit(limit).stream();
    req.on('close', stream.close.bind(stream));  // manually close on request cancel
    // how can you stream to the socket?
    // how do you know when the amount is reached to end the response?
  });
}

我想知道的是; 如何将此查询的结果流式传输到 io 套接字中?每当找到结果时,我想基本上发出一个added 事件,使用表名、id 和找到的条目作为参数。

【问题讨论】:

  • 你的数据源或数据类型与socket.io无关。你问的这么有效 - 如何使用 socket.io 流式传输数据?你试过了吗?
  • 我特意问,使用带 knex 的流式接口如何流式传输。我有来自 knex 的链接文档
  • knex 公开了一个通用的流协议,它可以以通用的方式与 socket.io 一起工作。如果您发布您尝试将数据流式传输到 socket.io 的确切问题,它将更好地帮助您。

标签: node.js postgresql sockets socket.io knex.js


【解决方案1】:

如何流式传输到套接字?

您可以通过从 knex 流中侦听 data 事件并通过 io.emit 将数据传递到 socket.io 来访问流式 DB 行。

您如何知道何时达到结束响应的金额?

流将发出一个end 事件。

您知道当end 事件触发时流已完成,但由于您在 HTTP 通道上接受请求但通过单独的 Web 套接字通道响应,您可以立即将 HTTP 响应发送到 res 而无需等待如果您愿意,可以查看数据库查询结果 (res.send())。

 module.exports = function (app, io) {
  app.get('/users', function (req, res, next) {
    const limit = req.queryParams.limit || 100;
    const stream = req.db.select('*').from('users').limit(limit).stream();
    stream.on('data', function (row) {
      io.emit('user', row)
    })
    .on('error', function (error) {
      io.emit('error', error.message)
    })
    .on('end', function () {
      io.emit('end')
    })
    req.on('close', stream.close.bind(stream));  // manually close on request cancel
    // how can you stream to the socket?
    // how do you know when the amount is reached to end the response?
  });
}

【讨论】:

  • 非常感谢!但是,您如何知道这些事件已发出?有什么办法可以告诉吗?我在文档中没有看到它
  • 这正是我之前试图解释的通用方式 :) 当然也是正确的方式。
  • 是的,但是您怎么会知道这些事件会发生?当我写它时,我认为这看起来是对的。你是说它实现了与net.Socket 类相同的方法和事件?
  • 这些是标准的流事件,即使流是空的,事件end 也会一直发生。事件 close 虽然取决于流实现。
  • Th node core API docs 定义可读和可写流的标准 API。这些 API 包括事件名称和参数以及流实例本身的方法,以及所有相关的语义、保证、警告等。任何声明它是 node.js 流的东西都应该符合这个 API。因此,它们具有广泛的互操作性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多