ExpressJS和匹配的延迟响应与原始请求

时间:2014-01-01 13:37:35

标签: node.js express

我正在寻找一种设计模式,而不是将原始请求和响应对象的答案流匹配。

假设我收到了所有狗图片的网络请求。我想将该请求提交给消息队列,以便工作进程最终可以处理它。当工作机器抓取狗图片请求时,它执行工作并将响应提交给由Express监视的应答队列。当我处理传入队列时,我想将狗图片响应与原始请求和响应对象进行匹配,这样我就可以返回狗列表或进一步处理它。

我遇到了两种解决方案,但每种解决方案都显得不够优雅。我可以保留对原始上下文的全局引用,找到它,然后从全局列表中删除它。

或者我可以创建对响应队列的订阅,并在所有答案中查找我的答案。这可行,但是效率低,而且其复杂性几何上升。 (10x10,100x100,1000x1000)

1 个答案:

答案 0 :(得分:1)

var express = require('express');
var app = express();
app.get('/doglist.txt', function(req, res){
  putReqIntoQueue(req,res,"dogs");
});
var theRequests ={};
var i = 0;
var giveUpSecs = 60;
var putReqIntoQueue = function(req,res,payload) {
   var index = 'index_'+i;
   i++
   var obj = {req:req,res:res,payload:payload,index:index}
   theReqests[index] = obj;
   var timeoutId = setTimeout(function(theIndex) {
      theRequest[theIndex].res.send('timeout error');
      delete theRequest[theIndex];
   }(index),giveUpSecs*1000);
   // insertIntoQueue(index,payload,timeoutId)
}
var onNewQueueResponse = function(index,payload,answer,timeoutId) {
   clearTimeout(timeoutId);
   if (index in theRequests) {
      var obj = theRequests[index];
      obj.res.send(payload);
      delete theRequests[index];
   } else {
      // must have already timed out
   }
}
// Queue("onNewMessage",onNewQueueResponse)

app.listen(3000);
console.log('Listening on port 3000');

这个答案假定某种接受工作的队列(insertIntoQueue)然后在通过“onNewMessage”事件完成时返回数据。它会在60秒后超时。