假设我有一个按给定ID返回客户信息的服务。如果找不到,我会返回null。
我的应用程序调用此服务:
http.get('http://myserver/myservice/customer/123', function(res) {
res.on('data', function(d) {
callback(null, d);
});
}).on('error', function(e) {
callback(e);
});
目前我的服务响应200但没有数据。
如果没有返回数据,我该如何处理?
我应该更改它以返回不同的http代码吗?在这种情况下如何处理?我尝试了许多不同的方法但没有成功。
答案 0 :(得分:3)
首先,重要的是要记住res
是数据流;就目前而言,您的代码很可能会使用数据块多次调用callback
。 (每次有新数据进入时都会触发data
事件。)如果您的方法一直在运行,那只是因为响应足够小,响应有效负载没有分成多个块。
为了让您的生活更轻松,请使用处理缓冲HTTP响应正文的库,并允许您获取完整的响应。快速搜索npm会显示request包。
var request = require('request');
request('http://server/customer/123', function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(null, body);
} else {
callback(error || response.statusCode);
}
});
就您的服务而言,如果找不到客户ID,返回404 - 如果实际上没有此类客户,则返回200 OK时语义无效。
答案 1 :(得分:1)
使用Client Response 'end'
event:
//...
res.on('data', function(d) {
callback(null, d);
}).on('end', function() {
console.log('RESPONSE COMPLETE!');
});
答案 2 :(得分:0)
我终于找到了解决问题的方法:
http.get('http://myserver/myservice/customer/123', function(res) {
var data = '';
response.on('data', function(d) {
data += d;
});
response.on('end', function() {
if (data != '') {
callback(null, data);
}
else {
callback('No customer was found');
}
});
}).on('error', function(e) {
callback(e);
});
这解决了这个问题,但我也会采用josh3736的建议,并在找不到客户时返回我的服务404.