Express.js - 在HTTP请求期间对RabbitMQ事件的res.send()?

时间:2014-12-17 23:38:42

标签: node.js asynchronous express rabbitmq

我在我的网站上进行用户注册。

exports.regitser = (req, res)->
  user = 
    unique_id : "RANDOM_HASH"
    name      : escape(req.body.name)
    pass      : escape(req.body.pass)
    ...

    # registrations starts here

此时我需要将数据推送到RabbitMQ交换,并在单独的队列"reg_results"中等待响应。在我使用"reg_results收到unique_id="RANDOM_HASH"“消息后,该用户(此HTTP请求)的注册似乎已成功完成,现在我可以res.send("You are registered!")来客户端。

在来自客户端的持续HTTP请求的上下文中处理此模式的最佳方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

这很简单。您需要了解的主要事项是register(req,res) 在函数完成时不必向res提供结果。结果可以在以后随时发送。所以,对于你的代码来说,这将是一线

exports.register = (req, res)->
  user = 
  ...
  # registrations starts here
  //send your registration message here
  app.resultsQueue.subscribe (msg) ->
     if (msg is mine) res.render(msg)

使用某种Promise超时(在注册消息未在给定时间内到达的情况下)使代码更整洁可能是有意义的。

那么您的代码将是(我将切换到JavaScript)

# registrations starts here
var deferred = Q.defer();
deferred.promise.timeout(5000).then(function (msg) {
   if (typeof msg == "Error")
      //handle timeout 
   else 
      res.render(msg)
});
app.resultsQueue.subscribe (function(msg) {
     if (msg is mine)  deferred.resolve(msg);
});