查询表然后使用knex和postgres将结果传输到socket.io

时间:2016-02-01 14:31:34

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

我希望查询一个表,并在它们进来时将内容写入套接字,以获得更大的查询。 I was reading the documentation for streams。我试图用socket.io来实现它。以下是$date = '2015-01-10'; $team - 'Team C'; $sql = "select * from TABLE where date_format(IntervalDate, '%Y-%m-%d') <> $date and team = $team"; 路由的示例,其中/usersapp的实例,expressio个实例。

socket.io

我想知道的是; 如何将此查询的结果流式传输到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? }); } 事件,使用tablename,id和found条目作为参数。

1 个答案:

答案 0 :(得分:3)

  

如何流式传输到套接字?

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

  

你怎么知道何时达到结束回应的金额?

该流将发出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?
  });
}