我正在开发一个节点应用程序,它侦听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
。
似乎post处理程序失败了,回调函数从未被调用。如果我将函数替换为console.log('it worked');
,我可以验证它是否被调用,但不能让它实际响应请求。
所以我想问题是我如何保持请求打开,直到我从第二个应用程序得到回复,这是正确的方法吗?
我更喜欢使用中间层,如下代码所示
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