无论服务器响应状态码如何,您的回调都会被调用,因此在回调中,请检查
response.statusCode
。也就是说,在您正在处理的级别上,4xx状态代码不是
错误;服务器已经响应,只是服务器响应说资源不可用(等等)。
这在文档中有所说明,但通常含糊不清。下面是他们给出的示例,并附有指向相关部分的注释:
var https = require('https');
https.get('https://encrypted.google.com/', function(res) {
console.log("statusCode: ", res.statusCode);
console.log("headers: ", res.headers);
res.on('data', function(d) {
process.stdout.write(d);
});
}).on('error', function(e) {
console.error(e);
});
如果你尝试使用未知资源,你会看到statusCode: 404
。
因此,对于你正在做的事情,你可能需要像这样的东西:
var deferred = $q.defer();
var req = https.get(options, function (response) {
var str = "";
if (response.statusCode < 200 || response.statusCode > 299) {
response.on("data", function() { } );
deferred.reject();
}
else {
response.on("data", function (chunk) {
str += chunk;
});
response.on("end", function () {
console.log("[evfService] Got user info: " + str);
deferred.resolve(str);
});
}
});
req.on("error", function (e) {
deferred.reject();
});
¹ 针对处理非"OK"状态码的分支,空的data
事件处理程序存在于文档中的以下备注原因:
...如果添加了一个'response'
事件处理程序,则必须消耗来自响应对象的数据,可以通过在每次出现'readable'
事件时调用response.read()
、添加'data'
事件处理程序或调用.resume()
方法来完成。在数据被消耗之前,'end'
事件不会触发。此外,在读取数据之前,它将占用内存,最终可能导致"进程内存不足"错误。
由于我们正在向https.get
传递一个函数,因此我们正在挂接'response'
事件,这表明我们需要执行其中一项操作(在本例中,我添加了一个无作用的data
事件处理程序)。感谢Nicolas2bert指出这一点!