确保 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'});
}
});
})
实现这个,不需要写同步代码
app.all('/api/*', function(req,res) {
request({url : .. , timeout : ..},function(err, resp, body){
//error handling
res.send("your response");
});
})
我有一个 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'});
}
});
})
实现这个,不需要写同步代码
app.all('/api/*', function(req,res) {
request({url : .. , timeout : ..},function(err, resp, body){
//error handling
res.send("your response");
});
})