繁体   English   中英

具有JSON.parse的JSON中位置0处的意外令牌<

[英]Unexpected token < in JSON at position 0 with JSON.parse

我正在遍历一个对象,并对该对象的项目向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获得的所有数据后(考虑到已记录的数据,它已经被正确解析),控制台在运行代码后几分钟,在JSON位置0向我提供了Unexpected令牌<错误。 当我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>

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

// 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

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

根据您的编辑

您从Cloudflare收到了一个错误页面,该页面显然不是有效的JSON。 因此,您的问题不是JSON解析,而是您请求的URL不正确,或者您受到速率限制/阻止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM