Restify res.send()不在事件监听器回调内部调用

时间:2015-08-05 14:09:06

标签: javascript node.js express mq restify

我正在使用restify 2.8.4,nodejs 0.10.36和IBM MQ Light消息传递。

这是一个RPC模式,只要接收器准备好结果,它就会发出一个事件,并且在下面解析POST路由将捕获事件和数据,并用res.send ()回复。

问题是,res.send ()不是触发器。而且我不明白为什么res.send ()没有被触发。此POST路由中只有一个res.send ()

尝试res.write ()res.end ()。一样。没有触发。

非常感谢任何建议。

route.js

server.post ('/user', function (req, res, next) {
  var body = req.body;

  var recvClient = createRecv ();

  var sendClient = createSend (body);

  recvClient.on ("receiver:got:it", function () {
    // receiver has confirmed received message
    // so sender client can be released 
    console.log ('stopping send client...'.info);
    sendClient.stop ();
  });

  recvClient.on ("receiver:replied", function (data) {
    // event callback was triggered
    console.log ('receiver replied captured...');

    res.send ();
    return next ();
  });

});

receiver.js

recvClient.on('started', function() {
    recvClient.subscribe(topicPattern, {qos: 1, autoConfirm: false, credit: 1});

    recvClient.on('message', function(data, delivery) {
      console.log('Recv: ' + util.inspect (data, false, null));

      delivery.message.confirmDelivery (function () {
        recvClient.emit ('receiver:got:it'); 
      });

      var user = new User (data);     
      user.create ()           
      .then (function (user) { 
        recvClient.emit ('receiver:replied', user);
    }, function (err) {      
        recvClient.emit ('receiver:replied', {err: err.message});
    })
      .finally (function (){   
        console.log ('stopping receiver client...');
        recvClient.stop ();    
      });

    });
  });

输出轨迹

body: {}  //stuff here
Recv: {}  // receiver received body stuff
stopping send client...
// do work

receiver replied captured...
stopping receiver client...

更新1

如果我将事件发射器替换为来自接收器的另一个发送/接收消息队列,则会调用res.send ()

这种方法比事件发射器更麻烦。我仍然拒绝相信为什么事件发射器不会起作用。

var rpcReceive = new RpcReceive ("user.create.replied", {qos:1, autoConfirm: false, credit: 1});

rpcReceive.receive (recvClient)
.then (function (user){
  res.send (user);
  return next ();
})
.then (undefined, function (err){
  return next (new restify.errors.BadRequestError (err.message));
});

2 个答案:

答案 0 :(得分:1)

问题看起来像route.js的结构。实际上,recvClient.on事件不应该依赖于server.post('/ user')。正确的结构应该是:

navmenu.php

你的receiver.js应该低于逻辑(除了你的代码)以接收来自route.js的响应。

var recvClient = createRecv ();     // should be global object

server.post ('/user', function (req, res, next) {
  var body = req.body;

  //var recvClient = createRecv ();     //commented out this code as this is moved out of this API.

  //var sendClient = createSend (body); //commented out this code. May be this wont be required.

});

recvClient.on ("receiver:got:it", function () {
    // receiver has confirmed received message
    // so sender client can be released 
    console.log ('stopping send client...'.info);
    //sendClient.stop ();       //commented out this code. May be this wont be required.
});

recvClient.on ("receiver:replied", function (data) {
    // event callback was triggered
    console.log ('receiver replied captured...');

    //res.send ();              
    //return next ();       

    /*commented out these two lines. Instead of sending response like this, emit some event from here, which can be consumed on receiver.js. Use something like below code to send response to receiver.js */
    recvClient.emit('sending:response', "response");
});

如果您发现问题,请尝试此操作并回复。我在创建聊天应用程序时使用了类似的逻辑来发出和使用事件。如果您仍然遇到问题,请告诉我。

答案 1 :(得分:0)

你可以试试 res.json({' status':200})