如果在nodejs中没有收到数据时如何处理http.get()?

时间:2012-10-17 19:18:02

标签: http node.js

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

3 个答案:

答案 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.