javascript - JSON.parse 中 JSON 中位置 0 处出现意外标记 <

标签 javascript node.js json

我正在迭代一个对象,并使用该对象中的项目向 API 发出多个请求,以获取数据并将其发送到数据库。接收数据时,我使用 JSON.parse() 将 json 存储在变量中,并将其发送到回调,在回调中进行处理并最终发送到数据库。

研究这个问题并在 StackOverflow 上看到类似的问题后,考虑到请求中的数据解析得很好,我仍然无法弄清楚我的问题,但在运行代码几分钟后我就遇到了这个问题。

async.forEach(players, function(item, callback) {

        var playerAccountId = (item.accountId).replace(/-/gi, '');
        var kills = item.kills;
        var placement = item.placement;

        let options = {
            url: "https://fortnite-api.theapinetwork.com/prod09/users/public/br_stats_v2?user_id=" + playerAccountId,
            method: 'GET',
            headers: {
                'content-type': 'application/json',
                'Authorization' : 'c825697ee0b871c684332601b46c2b71'
            }
        };

    // -------------------- //

        function requestData(callback) {
            request(options, function(err, res, body) {
                body = body.trim();
                let json = JSON.parse(body);
                let username = json.data.username;
                return callback(username);

            });
        }

        function doSomething(name) { //Send data directly to database from this callback
            //console.log(name);

            var player = {
                "Name": name,
                "Account ID": playerAccountId,
                "Kills": kills,
                "Placement": placement
            }
            console.log(player);

        }
        requestData(doSomething);
    });





在我console.log我得到的所有数据(考虑到它被记录,它在某种程度上被正确解析)后,在我运行代码几分钟后,控制台在位置0错误处给了我JSON中的意外标记<。当我 console.log(player) 时,没有任何问题,并且为每个玩家记录了一个对象。

注意:我为此 API 创建了另一个帐户,以便其他人可以使用不是我的实际授权 ID 的授权 ID 来测试此问题。

通过回调函数传递正文并记录它时出错。

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en-US"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en-US"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en-US"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en-US"> <!--<![endif]-->
<head>
<title>fortnite-api.theapinetwork.com | 524: A timeout occurred</title>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta name="robots" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" />
<link rel="stylesheet" id="cf_styles-css" href="/cdn-cgi/styles/cf.errors.css" type="text/css" media="screen,projection" />
<!--[if lt IE 9]><link rel="stylesheet" id='cf_styles-ie-css' href="/cdn-cgi/styles/cf.errors.ie.css" type="text/css" media="screen,projection" /><![endif]-->
<style type="text/css">body{margin:0;padding:0}</style>
</head>
<body>
<div id="cf-wrapper">
<div id="cf-error-details" class="cf-error-details-wrapper">
<div class="cf-wrapper cf-error-overview">
<h1>
<span class="cf-error-type">Error</span>
<span class="cf-error-code">524</span>
<small class="heading-ray-id">Ray ID: 4e465e6118edcce2 &bull; 2019-06-09 22:00:24 UTC</small>
</h1>
<h2 class="cf-subheadline">A timeout occurred</h2>
</div>
<div class="cf-section cf-highlight cf-status-display">
<div class="cf-wrapper">
<div class="cf-columns cols-3">
<div id="cf-browser-status" class="cf-column cf-status-item cf-browser-status ">
<div class="cf-icon-error-container">
<i class="cf-icon cf-icon-browser"></i>
<i class="cf-icon-status cf-icon-ok"></i>
</div>
<span class="cf-status-desc">You</span>
<h3 class="cf-status-name">Browser</h3>
<span class="cf-status-label">Working</span>
</div>
<div id="cf-cloudflare-status" class="cf-column cf-status-item cf-cloudflare-status ">
<div class="cf-icon-error-container">
<i class="cf-icon cf-icon-cloud"></i>
<i class="cf-icon-status cf-icon-ok"></i>
</div>
<span class="cf-status-desc">Newark</span>
<h3 class="cf-status-name">Cloudflare</h3>
<span class="cf-status-label">Working</span>
</div>
<div id="cf-host-status" class="cf-column cf-status-item cf-host-status cf-error-source">
<div class="cf-icon-error-container">
<i class="cf-icon cf-icon-server"></i>
<i class="cf-icon-status cf-icon-error"></i>
</div>
<span class="cf-status-desc">fortnite-api.theapinetwork.com</span>
<h3 class="cf-status-name">Host</h3>
<span class="cf-status-label">Error</span>
</div>
</div>
</div>
</div>
<div class="cf-section cf-wrapper">
<div class="cf-columns two">
<div class="cf-column">
<h2>What happened?</h2>
<p>The origin web server timed out responding to this request.</p>
</div>
<div class="cf-column">
<h2>What can I do?</h2>
<h5>If you're a visitor of this website:</h5>
<p>Please try again in a few minutes.</p>
<h5>If you're the owner of this website:</h5>
<p><span>The connection to the origin web server was made, but the origin web server timed out before responding. The likely cause is an overloaded background task, database or application, stressing the resources on your web server. To resolve, please work with your hosting provider or web development team to free up resources for your database or overloaded application.</span> <a href="https://support.cloudflare.com/hc/en-us/articles/200171926-Error-524">Additional troubleshooting information here.</a></p>
</div>
</div>
</div>
<div class="cf-error-footer cf-wrapper">
<p>
<span class="cf-footer-item">Cloudflare Ray ID: <strong>4e465e6118edcce2</strong></span>
<span class="cf-footer-separator">&bull;</span>
<span class="cf-footer-item"><span>Your IP</span>: 173.54.204.123</span>
<span class="cf-footer-separator">&bull;</span>
<span class="cf-footer-item"><span>Performance &amp; security by</span> <a href="https://www.cloudflare.com/5xx-error-landing?utm_source=error_footer" id="brand_link" target="_blank">Cloudflare</a></span>
</p>
</div>
</div>
</div>
</body>
</html>

最佳答案

在您的请求选项中,您可以执行以下操作,而不是设置 header :

// add `json: true`, and moved the query string to `qs` to automatically encode
let options = {
    url: "https://fortnite-api.theapinetwork.com/prod09/users/public/br_stats_v2",
    qs: {
        user_id: playerAccountId
    },
    method: 'GET',
    json: true, // add this
    headers: {
        'Authorization' : 'c825697ee0b871c684332601b46c2b71'
    }
};

// removed json parsing and trimming.
function requestData(callback) {
    request(options, function(err, res, body) {
        let username = body.data.username;
        return callback(username);
    });
}

这会自动将响应转换为 JSON 对象,因此您不必使用 JSON.parse

如果您仍然看到相同的错误消息,则意味着返回的响应存在问题。在这种情况下,请发布正文或响应,以便我们提供帮助。

基于您的编辑:

您从 Cloudflare 收到错误页面,这显然不是有效的 JSON。所以你的问题不是 JSON 解析,而是你请求的 URL 不正确,或者你被限速/阻止。

关于javascript - JSON.parse 中 JSON 中位置 0 处出现意外标记 <,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56515893/

相关文章:

javascript - 将非 ui 逻辑放在 react/redux 应用程序中的什么位置?

javascript - Underscore.js - 使用正则表达式查找对象键的值?

node.js - 如何列出一个 npm 模块的所有版本?

node.js - REST 发布信息未通过 multipart/form-data 收到

jquery - 如何在JQuery中使用$.each循环遍历json代码

asp.net-mvc - Json ModelBinding 在 MVC3 RC2 中无法通过 Ajax 工作

javascript - 在 html div 标签中显示执行的脚本结果

javascript - 如何处理在 javascript/node js 中的 catch block 中发生的错误

node.js - 您应该为应用程序用户使用 AWS IAM 角色和权限吗?

php - 将 MySQL 输出解析为 JSON 提取字段名称