NodeJS在某些任务后发送响应

Posted

技术标签:

【中文标题】NodeJS在某些任务后发送响应【英文标题】:NodeJS Send response after some task 【发布时间】:2014-06-12 02:56:47 【问题描述】:

我正在开发一个节点应用程序,它侦听 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'); 替换该函数,我可以验证它是否被调用,但不能让它真正响应请求。

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

【问题讨论】:

你粘在 websockets 上了吗?或者你可以使用socket.io之类的东西吗? 客户端使用 sockjs,效果很好 是的 - 只是想 - 我知道如何使用 socket.io 并且我从来没有遇到过套接字关闭或你所说的发生在你身上的问题 - 所以我认为它可能是一个替代方案如果你想不出来。 感谢您的建议,问题不是 websocket,而是 http 请求中止 请求发生在哪里?我所看到的只是套接字的东西 【参考方案1】:

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

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);

);

如果它不起作用,请发表评论。 总帐

【讨论】:

以上是关于NodeJS在某些任务后发送响应的主要内容,如果未能解决你的问题,请参考以下文章

以分块传输编码发送的响应,并指示在某些数据已发送后发生的错误

nodejs - 在其他请求后无法响应[重复]

发送响应后如何在node.js api中运行后台任务?

Nodejs,expressjs - 如何提供延迟响应

Nodejs 发送部分响应

nodejs的http模块不是能够立即接收/发送整个请求/响应吗?