好吧,我一定是笨手笨脚的,因为我在任何地方都找不到在使用Node.JS http.get
或http.request
时如何获取错误状态代码。
My code:
var deferred = $q.defer();
var req = https.get(options, function(response) {
var str = '';
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(e);
});
在"req.on“位中,我想要的是http状态代码(即401、403等)。我得到的是一个半无用的error对象,它没有给我代码或对response对象的任何引用。
我尝试过在函数(响应)回调中拦截,但当有一个404时,它永远不会被调用。
谢谢!
发布于 2014-05-17 22:32:14
无论来自服务器的响应状态代码如何,您的回调都会被调用,因此在您的回调中,请检查response.statusCode
。也就是说,4xx状态码在您正在工作的级别上不是错误;服务器响应,只是服务器的响应是资源不可用(等等)。
这是in the documentation,但其特点是模糊不清。这是他们给出的例子,并有一个指向相关部分的注释:
var https = require('https');
https.get('https://encrypted.google.com/', function(res) {
console.log("statusCode: ", res.statusCode); // <======= Here's the status code
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) { // (I don"t know if the 3xx responses come here, if so you"ll want to handle them appropriately
response.on("data", function() { } ); // ¹
deferred.reject(/*...with appropriate information, including statusCode if you like...*/);
}
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(/*...with appropriate information, but status code is irrelevant [there isn"t one]...*/);
});
?处理非正常状态代码分支中的空data
事件处理程序存在,因为文档中有以下说明:
...if如果添加了
'response'
事件处理程序,则必须通过在发生'readable'
事件时调用response.read()
、通过添加'data'
处理程序或通过调用.resume()
方法来使用响应对象中的数据。在使用数据之前,不会触发'end'
事件。此外,在读取数据之前,它将消耗内存,这最终会导致“进程内存不足”错误。
因为我们将一个函数传递给https.get
,所以我们挂接了'response'
事件,这表明我们需要做其中的一件事(在本例中,我添加了一个不做任何事情的data
处理程序)。感谢指出了这一点!
发布于 2014-05-17 22:33:21
错误代码400响应不会被node.js视为错误。
在下面的代码中尝试response.statusCode
:
request.on('response', function (response) {});
发布于 2016-06-10 05:26:37
下面是一个很小的获取错误代码的例子。只需将https
更改为http
并创建一个错误:
var https = require('https')
var username = "monajalal3"
var request = https.get("https://teamtreehouse.com/" + username +".json", function (response) {
console.log(response.statusCode);
});
request.on("error", function (error) {
console.error(error.status);
});
https://stackoverflow.com/questions/23712392
复制相似问题