http获取NodeJS如何获取错误状态代码?

use*_*766 28 javascript http node.js

好吧,我必须密集,因为我在使用Node.JS http.get或http.request时无法找到任何地方如何获取错误状态代码.我的代码:

    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);
    });
Run Code Online (Sandbox Code Playgroud)

在那个"req.on"位中,我想要的是http状态代码(即401,403等).我得到的是一个半无用的错误对象,它没有给我代码或对响应对象的任何引用.我试过拦截函数(响应)回调,但是当有404时,它永远不会被调用.

谢谢!

T.J*_*der 40

无论来自服务器的响应状态代码如何,都会调用您的回调,因此在回调中,请检查response.statusCode.也就是说,4xx状态代码不是您正在工作的级别的错误 ; 服务器响应,只是服务器响应说资源不可用(等)

这是在文档中,但特征模糊.这是他们提供的示例,注释指向相关位:

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);
});
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用(比如说)未知资源,您会看到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
        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]...*/);
});
Run Code Online (Sandbox Code Playgroud)


the*_*ski 10

node.js不会将400响应视为错误.

尝试使用response.statusCode:request.on('response',function(response){});


Mon*_*lal 5

这是一个非常小的示例,如何获取错误代码。只需将更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);
});
Run Code Online (Sandbox Code Playgroud)