0

假设我有一个通过给定 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 代码吗?在这种情况下如何处理?我尝试了许多不同的方法,但都没有成功。

4

3 回答 3

3

首先,重要的是要记住这res是一个数据流;就目前而言,您的代码可能会callback多次调用数据块。(data每次有新数据进入时都会触发该事件。)如果您的方法一直到此为止,那只是因为响应足够小以至于响应有效负载没有分成多个块。

为了让您的生活更轻松,请使用处理缓冲 HTTP 响应正文并允许您获得完整响应的库。在 npm 上快速搜索会显示请求包。

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 在语义上是无效的。

于 2012-10-17T19:31:46.023 回答
1

使用客户端响应'end'事件

    //...
    res.on('data', function(d) {
        callback(null, d);
    }).on('end', function() {
        console.log('RESPONSE COMPLETE!');
    });
于 2012-10-17T19:27:23.953 回答
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。

于 2012-10-17T19:48:41.420 回答