Node.js 获取Kue作业的结果并通过开放连接将其推送到客户端

Node.js 获取Kue作业的结果并通过开放连接将其推送到客户端,node.js,mongodb,websocket,message-queue,kue,Node.js,Mongodb,Websocket,Message Queue,Kue,我有一个API端点,它提供来自MongoDB的一些JSON。简单地说: router.get('/api/links', function (req, res) { // Find existing links links.find({ feed: 1 }, function (err, links) { res.json(links) }) }) 我希望这个端点触发一个Kue作业,当这个作业完成时,我希望以某种方式将作业的结果(数据库中的新链接)推送到客户端——类似于Tw

我有一个API端点,它提供来自MongoDB的一些JSON。简单地说:

router.get('/api/links', function (req, res) {
  // Find existing links
  links.find({ feed: 1 }, function (err, links) {
    res.json(links)
  })
})
我希望这个端点触发一个Kue作业,当这个作业完成时,我希望以某种方式将作业的结果(数据库中的新链接)推送到客户端——类似于Twitter stream API,它保持一个打开的HTTP
GET
请求

router.get('/api/links', function (req, res) {
  // Find existing links
  links.find({ feed: 1 }, function (err, links) {
    res.json(links)
  })
  // Kue job to update the links database
  jobs.create('update subscriptions', {
    title: req.user.username,
    feeds: feeds
  }).save()
  // When the job is done, the new links in the database (the output
  // of the Kue job) should be pushed to the client
})
但是,我不确定如何获得Kue作业的结果,也不确定在作业完成时如何将新接收的数据推送到客户端


如果无法获得Kue作业的结果,我可以在数据库中查询新文档。但是,我仍然不确定如何向客户端发送另一个响应。希望有人能给我指出正确的方向

事实上,这已包含在文档中-

“工作活动

作业特定事件通过Redis pubsub在作业实例上激发。当前支持以下事件:

  • 失败
    作业失败
  • complete
    作业已完成
  • 升级
    作业(延迟时)现在已排队
  • 进度
    作业的进度范围为0-100 例如,这可能看起来如下所示:

    var job = jobs.create('video conversion', {
    
        title: 'converting loki\'s to avi'
      , user: 1
      , frames: 200
    
    });
    
    job.on('complete', function(){
        console.log("Job complete");
    }).on('failed', function(){
        console.log("Job failed");
    }).on('progress', function(progress){
        process.stdout.write('\r  job #' + job.id + ' ' + progress + '% complete');
    });
    
请记住,您的作业可能不会立即处理(取决于您的队列),因此客户端可以等待一段时间以获得结果

编辑:如注释中所述,作业不会返回任何结果,因此应将结果与作业id一起存储在数据库中,并在作业完成时查询数据库


为了保持连接打开,请使用
res.write
res.end
而不是结束连接的
res.json
(您必须自己对数据进行
json.stringify
)。此外,请记住,如果这需要太长时间,浏览器可能会超时。

任何人都可以对此发表评论。使用“kue”时,我也有一个非常类似的问题,我非常惊讶地发现,尽管它支持“完成”、“失败”和“进度”等消息,但它无法将结果转发给请求者

通过“kue”源代码,我发现发送您自己的自定义消息(如“结果”消息)实际上非常容易。我所做的如下所示:

var events = require('kue/lib/queue/events');

...

    queue.process(task, function(job, done) {
      console.log("Did job: "+job.id);
      events.emit(job.id, "result", "Yeah baby!");
      done();
    });
使用此选项,您可以执行以下操作:

job.on("result", function(res) {
    console.log("Got result: "+res);
});
但是我讨厌戳到私有API,所以我提交了一份报告,通过在作业对象中添加一个“send”方法,在“kue”中进一步公开了这一点

在这种情况下,语法更加清晰,即


这并不能回答我的问题。文档中的事件不包括在事件中从作业发回信息(即作业的输出)。作业不会返回任何数据,您可以将结果存储在数据库中(连同作业id)并在作业完成时查询数据库中的结果。这实际上并没有回答问题。OP正在寻找一种方法来正确检索作业结果,并通过类似websocket的方式将其推回到客户端。我希望作业在浏览器超时前完成,这没有任何意义,也无法达到使用作业队列的目的首先,我更新了我的答案,请删除否决票
    queue.process(task, function(job, done) {
      console.log("Did job: "+job.id);
      job.send("result", "Yeah baby!");
      done();
    });