Node.js GET 请求有时会收到 HTML 文档而不是 JSON 并崩溃

Posted

技术标签:

【中文标题】Node.js GET 请求有时会收到 HTML 文档而不是 JSON 并崩溃【英文标题】:Node.js GET request sometimes receives HTML document instead of JSON and crashes 【发布时间】:2018-11-09 11:24:28 【问题描述】:

我正在使用 node.js(和 discord.js)来制作一个不和谐的机器人。

我正在使用带有 npm 请求模块的 GET 请求。当用户键入“!cat”时,代码按预期工作,它从https://aws.random.cat/meow 获取数据并发布猫图片但是有时服务器会给出 403 禁止错误,导致 html 页面而不是 JSON 并由于意外而使机器人崩溃令牌。

我正在寻找一种方法来检测 HTML 页面并停止代码/发布错误消息,方法是检测端点是 HTML 而不是 JSON,或者发送回的数据内容是:

JSON = file: 'https://catlink.jpg' HTML 403 = <!DOCTYPE HTML PUBLIC...

IMG1: Error - HTML page response, IMG2: Expected responses 1 per request

我目前的代码块如下:

//RANDOM CATS
if(command === "cat" || command === "meow")
//Connection options
var catoptions = 
  url: "https://aws.random.cat/meow",
  headers: 
    'Content-Type': 'application/json',
    'Accept': 'application.json'
  
;`

//Send the request
let request = require("request");
request(catoptions, function(err, response, body)
  if(err)
    console.log("error code #002");
   else 
    //Receive the body of the JSON
    var catresult = JSON.stringify(body); //stringify incase page returns HTML 403 error - Will recieve "<!DOCTYPE HTML PUBLIC..." as first bit of data
    console.log(catresult) //Send to log to see if JSON "cat pic" data is returned or the HTML 403 error
    let meowdata = JSON.parse(body);

    //Responbse body
    let meowpic = meowdata.file;
    console.log(meowpic); //Send link to console
    message.channel.send(meowpic); //Send link to discord channel with discord.js
  
);
 //END OF RANDOM CATS

【问题讨论】:

【参考方案1】:

JSON.parse 如果传递了无效的 JSON,则抛出异常,并且 HTML 不是有效的 JSON,您必须捕获异常以避免崩溃。

来自docs:

如果要解析的字符串无效,则抛出 SyntaxError 异常 JSON。

request(catoptions, function(err, response, body) 
    if (err) 
        console.log("error code #002");
     else 

        try 
            //Receive the body of the JSON
            let catresult = JSON.stringify(body); //stringify incase page returns HTML 403 error - Will recieve "<!DOCTYPE HTML PUBLIC..." as first bit of data
            console.log(catresult) //Send to log to see if JSON "cat pic" data is returned or the HTML 403 error
            let meowdata = JSON.parse(body);

            //Responbse body
            let meowpic = meowdata.file;
            console.log(meowpic); //Send link to console
            message.channel.send(meowpic); //Send link to discord channel with discord.js

         catch (e) 
            console.error(e);
        
    
);

【讨论】:

非常感谢!那成功了。如果其他人偶然发现该线程,我在 catch 中添加了 message.channel.send("Please try again") 以通知不和谐用户该错误。

以上是关于Node.js GET 请求有时会收到 HTML 文档而不是 JSON 并崩溃的主要内容,如果未能解决你的问题,请参考以下文章

node.js状态码

node.js http.get 在向远程站点发出 5 次请求后挂起

node.js中HTTP请求与响应处理

Node.js GET/POST请求

Node.js 请求下载文件有时为空或不存在

Node.js GET/POST请求