【问题标题】:Postpone responding to request in Node.js推迟响应 Node.js 中的请求
【发布时间】:2014-02-04 04:29:31
【问题描述】:

当侦听端口 3000 的 Node.js Express 服务器收到请求时,它会路由到一个函数,该函数必须向另一个网站发出 POST 并在响应初始请求之前获得响应。

这可能吗?

这是我正在使用的代码:

app.get('/silence/:host', routes.silence);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

exports.silence = function(request, response){
   var hostname = utils.validateHost(request);
   if (stash.createSilencer(hostname)) {
      response.writeHead(200, {"Content-Type": "application/json"});
      response.write('{ "success" : true, "message" : "Successfully silenced host'" }');
      response.end();
   }
}

exports.createSilencer = function(hostname) {
   var options = {
      url: 'http://x.x.com:4567/create/silencer/' + hostname ,
      method: 'POST',
      body: '{ "timestamp": ' + utils.timestamp() + '} '
   };
   request(options, silencer_callback);
   ##### DONT WANT TO RETURN UNTIL THE silencer_callback IS INVOKED
   return true;
}

function silencer_callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        var info = JSON.parse(body);
        console.log("Response Recieved");
    }
}

【问题讨论】:

  • 当然有可能,它就是这样工作的,你得到一个请求,创建一些数据,返回一个响应。我们可以帮助你吗,不,我们不能,因为你没有发布任何代码,这应该是微不足道的,至少你自己开始。
  • 正如 adeneo 所说,是的,这是可能的。事实上,很难编写以这种方式工作的代码,因为 node 中的几乎所有内容都依赖于回调和事件。如果您需要有关特定案例的帮助,请发布您的代码。

标签: node.js


【解决方案1】:

诀窍是在收到 POST 请求的响应之前,不要调用 response.write()response.end()。您只需退出该方法而不发回响应。获得 POST 请求的结果后,即可完成初始响应。

exports.silence = function(req, res){    
    var hostname = utils.validateHost(req);
    stash.createSilencer(hostname, function(error, response, body) {
      if (!error && response.statusCode == 200) {
        var info = JSON.parse(body);
        console.log("Response Received");
      }
      // we get POST-response, lets response to initial request here
      res.writeHead(200, {"Content-Type": "application/json"});
      res.write('{ "success" : !error, "message" : "Successfully silenced host'" }');
      res.end();
    });
    // return from the function, but do not send response back yet
}

exports.createSilencer = function(hostname, callback) {
    var options = {
        url: 'http://x.x.com:4567/create/silencer/' + hostname ,
        method: 'POST',
        body: '{ "timestamp": ' + utils.timestamp() + '} '
    };
    request(options, callback);
    // return from the function, but do not send response back yet
}

【讨论】:

  • 看起来不错。除了传递给exports.silence函数的“response”变量与回调返回的“response”不同。回调将“响应”返回给 POST。很抱歉造成混乱。
  • 对不起,我有点厚。我明白,它就像一个魅力。,
猜你喜欢
  • 2014-11-05
  • 1970-01-01
  • 2014-08-15
  • 2018-01-05
  • 1970-01-01
  • 2020-11-25
  • 2018-04-03
  • 1970-01-01
  • 2013-08-05
相关资源
最近更新 更多