node.js - 在 Node.js 中推迟响应请求

标签 node.js

当我的 Node.js Express 服务器(正在监听端口 3000)收到请求时,它会路由到一个函数,该函数必须向另一个网站发出 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");
    }
}

最佳答案

诀窍是,在收到 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
}

关于node.js - 在 Node.js 中推迟响应请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21535723/

相关文章:

node.js - 错误 MSB4062 : The "SetEnv" task could not be loaded from the assembly

node.js - 与 socket.io 一起使用时,express-session 未设置 session cookie

windows - node-expat 在 Windows 上编译但找不到模块

javascript - Node.js Passport -facebook 回调循环

node.js - Nodejs 使用什么日志库?

node.js - 如何让 Express 返回我刚刚在 MongoDB 中删除的对象

node.js - 使用 node-imap 接收 IDLE 通知

javascript - Nestjs无法解决依赖关系,找不到我的错误

javascript - 对象 javascript 的条件

node.js - 使用 redis pubsub 离线处理订户服务器?