Javascript 如何检索HTTP响应错误的详细信息

Javascript 如何检索HTTP响应错误的详细信息,javascript,node.js,httprequest,Javascript,Node.js,Httprequest,我有一个node.js应用程序正在向ReST web服务发出一些https请求。 从表面上看,我想做一些看起来应该很简单的事情——检索从web服务返回的错误消息 我可以获得状态代码-即200、404等,但无法获得错误的详细信息 响应的主体如下所示: { "type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5", "title" : "Not Found", "status": "4

我有一个node.js应用程序正在向ReST web服务发出一些https请求。 从表面上看,我想做一些看起来应该很简单的事情——检索从web服务返回的错误消息

我可以获得状态代码-即200、404等,但无法获得错误的详细信息

响应的主体如下所示:

{
    "type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5",
    "title" : "Not Found",
    "status": "404",
    "detail": "Resource not found: X33003"
}
var options = {
    "method": "POST",
    "hostname": "myhost.com",
    "port": null,
    "path": "/mypath/",
    "headers": {
        "content-type": "application/json",
        "authorization": basicAuthString,
        "cache-control": "no-cache"
    }
};

try {
     var reqWorkSkill = http.request(options, function(res) {
     var chunks = [];
     res.on("data", function(chunk) {
         chunks.push(chunk);
     });
     res.on("end", function() {
         var body = Buffer.concat(chunks);             
         var response = JSON.parse(body);
         console.log("Detail: " + body.detail);  // COMES BACK UNDEFINED
     });
     res.on("error", function(error) {         
         console.log("Something went wrong with: " + resourceIdArray[i] + " failed: " + error);
     });
     if(res.statusCode != 200){
         // Do some stuff
     }
     console.log("res status: " + res.statusCode);
     console.log("res text: " + res.statusText); // COMES BACK UNDEFINED

    });
    reqWorkSkill.write(itemToPost);                       
    reqWorkSkill.end();
} 
catch (e) {
    console.log(e);
}
var options = {
    "method": "POST",
    "hostname": "myhost.com",
    "port": null,
    "path": "/mypath/",
    "headers": {
        "content-type": "application/json",
        "authorization": basicAuthString,
        "cache-control": "no-cache"
    }
};

try {
     var reqWorkSkill = http.request(options, function(res) {
     var chunks = [];
     res.on("data", function(chunk) {
         chunks.push(chunk);
     });
     res.on("end", function() {
         var body = Buffer.concat(chunks);             
         var response = JSON.parse(body);
         console.log("Detail: " + response.detail);  // response, not body
     });
     res.on("error", function(error) {         
         console.log("Something went wrong with: " + resourceIdArray[i] + " failed: " + error);
     });
     if(res.statusCode != 200){
         // Do some stuff
     }
     console.log("res status: " + res.statusCode);
     console.log("res text: " + res.statusMessage); // statusMessage, not statusText

    });
    reqWorkSkill.write(itemToPost);                       
    reqWorkSkill.end();
} 
catch (e) {
    console.log(e);
}
我的代码如下所示:

{
    "type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5",
    "title" : "Not Found",
    "status": "404",
    "detail": "Resource not found: X33003"
}
var options = {
    "method": "POST",
    "hostname": "myhost.com",
    "port": null,
    "path": "/mypath/",
    "headers": {
        "content-type": "application/json",
        "authorization": basicAuthString,
        "cache-control": "no-cache"
    }
};

try {
     var reqWorkSkill = http.request(options, function(res) {
     var chunks = [];
     res.on("data", function(chunk) {
         chunks.push(chunk);
     });
     res.on("end", function() {
         var body = Buffer.concat(chunks);             
         var response = JSON.parse(body);
         console.log("Detail: " + body.detail);  // COMES BACK UNDEFINED
     });
     res.on("error", function(error) {         
         console.log("Something went wrong with: " + resourceIdArray[i] + " failed: " + error);
     });
     if(res.statusCode != 200){
         // Do some stuff
     }
     console.log("res status: " + res.statusCode);
     console.log("res text: " + res.statusText); // COMES BACK UNDEFINED

    });
    reqWorkSkill.write(itemToPost);                       
    reqWorkSkill.end();
} 
catch (e) {
    console.log(e);
}
var options = {
    "method": "POST",
    "hostname": "myhost.com",
    "port": null,
    "path": "/mypath/",
    "headers": {
        "content-type": "application/json",
        "authorization": basicAuthString,
        "cache-control": "no-cache"
    }
};

try {
     var reqWorkSkill = http.request(options, function(res) {
     var chunks = [];
     res.on("data", function(chunk) {
         chunks.push(chunk);
     });
     res.on("end", function() {
         var body = Buffer.concat(chunks);             
         var response = JSON.parse(body);
         console.log("Detail: " + response.detail);  // response, not body
     });
     res.on("error", function(error) {         
         console.log("Something went wrong with: " + resourceIdArray[i] + " failed: " + error);
     });
     if(res.statusCode != 200){
         // Do some stuff
     }
     console.log("res status: " + res.statusCode);
     console.log("res text: " + res.statusMessage); // statusMessage, not statusText

    });
    reqWorkSkill.write(itemToPost);                       
    reqWorkSkill.end();
} 
catch (e) {
    console.log(e);
}

能够准确地显示出出错的地方是非常有用的,即上面JSON中的消息:Resource not found:X33003。我怎样才能找到它?

您刚才调用的对象的属性不正确。首先,您调用了
body.detail
,但是
body
Buffer
表示。您需要调用
response
上的
detail
属性。其次,您试图获取响应的
statusText
属性,但正确的属性是
statusMessage
。代码的结尾如下:

{
    "type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5",
    "title" : "Not Found",
    "status": "404",
    "detail": "Resource not found: X33003"
}
var options = {
    "method": "POST",
    "hostname": "myhost.com",
    "port": null,
    "path": "/mypath/",
    "headers": {
        "content-type": "application/json",
        "authorization": basicAuthString,
        "cache-control": "no-cache"
    }
};

try {
     var reqWorkSkill = http.request(options, function(res) {
     var chunks = [];
     res.on("data", function(chunk) {
         chunks.push(chunk);
     });
     res.on("end", function() {
         var body = Buffer.concat(chunks);             
         var response = JSON.parse(body);
         console.log("Detail: " + body.detail);  // COMES BACK UNDEFINED
     });
     res.on("error", function(error) {         
         console.log("Something went wrong with: " + resourceIdArray[i] + " failed: " + error);
     });
     if(res.statusCode != 200){
         // Do some stuff
     }
     console.log("res status: " + res.statusCode);
     console.log("res text: " + res.statusText); // COMES BACK UNDEFINED

    });
    reqWorkSkill.write(itemToPost);                       
    reqWorkSkill.end();
} 
catch (e) {
    console.log(e);
}
var options = {
    "method": "POST",
    "hostname": "myhost.com",
    "port": null,
    "path": "/mypath/",
    "headers": {
        "content-type": "application/json",
        "authorization": basicAuthString,
        "cache-control": "no-cache"
    }
};

try {
     var reqWorkSkill = http.request(options, function(res) {
     var chunks = [];
     res.on("data", function(chunk) {
         chunks.push(chunk);
     });
     res.on("end", function() {
         var body = Buffer.concat(chunks);             
         var response = JSON.parse(body);
         console.log("Detail: " + response.detail);  // response, not body
     });
     res.on("error", function(error) {         
         console.log("Something went wrong with: " + resourceIdArray[i] + " failed: " + error);
     });
     if(res.statusCode != 200){
         // Do some stuff
     }
     console.log("res status: " + res.statusCode);
     console.log("res text: " + res.statusMessage); // statusMessage, not statusText

    });
    reqWorkSkill.write(itemToPost);                       
    reqWorkSkill.end();
} 
catch (e) {
    console.log(e);
}

如果没有得到正确的结果,最好是
控制台。记录您试图访问的对象(或等效对象),这将显示该对象的所有属性。

我们可以查看
选项
对象吗?另外,您是否需要二进制数据?Hi ishegg-已更新以包含选项对象。返回的数据不是二进制的,或者没有返回状态为200的任何内容,或者,我想,一个包含我包含的JSON的主体。谢谢-我会尝试一下。在日志方面,绝对是这样——我一直想这样做。我尝试过登录(控制台和使用log4js),但没有找到一种有用的方法来显示属性。我刚看到[物体]被打印出来。您是否有办法查询对象以便记录其属性?当您使用
console.log()
对象
res
时会得到什么?我在终端中得到了完整的对象。我错误地迷恋req对象,而它是我需要的。我可以看到res的全部内容。再次感谢!很乐意帮忙。