NodeJS在完成某项任务后发送响应

时间:2014-06-12 02:56:48

标签: javascript node.js http express websocket

我正在开发一个侦听http请求的节点应用程序,拉出参数并通过websocket将它们传递给另一个应用程序,将应用程序的回复作为http响应返回。

简化代码:

app -> express instance
ws -> websocket object
cbs -> array to store key, value (callback functions)


app.post('/someCall', function(req,res) {
    var msg = req.body;
    msg.cb_id = "cb_id|"+Date.now(); // create unique id for callback fn
    cbs[msg.cb_id] = function() { // save callback
        res.send('got reply from ws');
    }
    ws.send(msg); //forward to websocket
}


ws.on('message', function(message) { // fired when we get a response from 2nd application
    var msg = JSON.parse(message);
    if(typeof(cbs[msg.cb_id]) === 'function')) { // check if we have registered a callback
        cbs[msg.cb_id](); // execute the saved callback
        delete(cbs[msg.cb_id]); // remove
    }
});

为了进一步简化现在的事情,第二个应用程序是一个节点实例,它只回显它收到的任何消息。我可以确认消息会恢复,但我会继续Error: Request aborted

似乎邮件处理程序失败了,回调永远不会被调用。如果我用say console.log('it worked');替换函数但是无法让它实际响应请求,我可以验证它是否会被调用。

所以我想问题是如何在我收到第二个应用程序的回复之前保持请求打开,这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

我更喜欢使用中间穿着,就像我在下面的代码中所做的那样

app.post('/someCall',function(req,res,next){
    ws.send(req.body); 
    ws.on('message', function(message) {
        req.params.resMessage = JSON.parse(message);
        next(); 
    });
},
function(req,res,next) {
    res.send('Got reply form ws : ' + req.params.resMessage);
}
);

如果不起作用,请发表评论。 GL