确保 nodejs 服务器在异步调用之前不响应?

Ensuring nodejs server does not respond before async call?

我有一个 NodeJS 服务器,它从客户端接收请求,然后自己向上游休息服务发出请求。我遇到的问题是我通过 express 对上游休息服务的调用是异步的,因此调用函数在收到来自上游服务器的响应之前返回给客户端。

client --->  serverA ---> serverB

示例:

app.all('/api/*', function(req,res) {
   request(...)
   // wait for response from request somehow
})

我到处都被告知不要在 NodeJS 中进行同步调用,因为它不会扩展,但在这一点上我没有事件会按预期运行。

谁能建议解决这个问题的正确方法?

您的快递路线没有自动响应。如果您不设置响应,那么服务器将不会响应(一段时间后您会收到错误消息)。

例如

app.get('/something', function(req,res) {

});

如果您向此路由器发送请求,它不会响应。所以你不用担心。

并严格针对您的问题。您的服务器请求必须在完成其调用(回调或承诺)后执行某些操作。

app.all('/api/*', function(req,res) {
   request(function(response){
       //callback
       //here you send response
       res.send('OK');
   });
})

但是如果您的服务器请求失败怎么办?也许你的服务器请求也return错误?

app.all('/api/*', function(req,res) {
   request(function(err, response){
     if(err){
       res.send('ERROR');
     } else {
       res.send('OK');
     }
   });
})

我不能更具体,因为我不知道细节。不过我的回答可能对你有点帮助。

您必须将回调函数传递给您的上游服务。

app.all('/api/*', function(req,res) {
   request(function(err, response){
     if(err){
       res.jsonp({'status':200,'message':'ALL OK'});
     } else {
       res.jsonp({'status':201,'message':'Something went wrong'});
     }
   });
})

你可以参考这个https://www.npmjs.com/package/request

实现这个,不需要写同步代码

app.all('/api/*', function(req,res) {
 request({url : .. , timeout : ..},function(err, resp, body){
  //error handling
   res.send("your response");
});


})