JavaScript: 解析来自 GitHub API 的 JSONP 回调响应

JavaScript: parsing JSONP callback response from GitHub API

我正在创建一个调用 GitHub API 的 Express 路由,并在端点添加了 ?callback=foo 模式,这样它将 return Link headers 我需要解析出 Link: header 因为它包含 link 我必须调用它来获取下一页回复。

问题是响应具有预期的模式,但是当我尝试创建一个函数来梳理函数的 metadata 部分时,它们未定义。

我的代码:

app.get('/populate', function(req, res, next) {
        console.log('/populate route hit');
        var token = "<something>";
        var options = {
            url: 'https://api.github.com/users?callback=resp',
            headers: {
                'User-Agent': 'Our-App',
                'Authorization': 'token '+ token 
            }
        };
        api(options) // 'api' is request-promise module, makes http requests
        .then(function(response) {
            console.log(response); // Note 1
            function resp(res) {
                var meta = res.meta;
                var data = res.data;
                console.log('meta ', meta); // Note 2
                console.log('data ', data);
            }
            resp(response);

注释 1:响应如下所示:

        /**/resp({"meta":{"X-RateLimit-Limit":"5000","X-RateLimit-Remaining":"4993",
    "X-RateLimit-Reset":"1435297775","X-OAuth-Scopes":"public_repo, user:email",
    "X-Accepted-OAuth-Scopes":"repo","Cache-Control":"private, max-age=60, s-maxage=60",
    "Vary":"Accept, Authorization, Cookie, X-GitHub-OTP",
"ETag":"\"0cbbd180648a54f839a237b0302025db\"",
    "X-GitHub-Media-Type":"github.v3; format=json",
    "Link":[["https://api.github.com/users?callback=resp&since=46",
{"rel":"next"}],["https://api.github.com/users{?since}",
{"rel":"first"}]],"status":200},"data":[{"login":"mojombo","id":1,
        ...etc etc...
        }]})

响应看起来像是 JSON.stringified 但是当我 JSON.parse(response) 它 return 是一个错误。我不知道如何访问 deeply-embedded Link: header 甚至 data,它看起来也像 JSON。

注 2 res.meta 和 res.data 记录为 undefined.

响应不是 JSON,而是 JSONP. JSONP is a cross-domain mechanism for retrieving data. You don't use XHR (e.g., app.get) to request JSONP, you use a script tag. (Because XHR is limited by the Same Origin Policyscript 标签不是。)

如果您通过 XHR 检索该数据的调用有效,则意味着在您的情况下允许跨域 XHR 调用(服务器支持 Cross-Origin Resource Sharing 页面来源,并且浏览器支持 CORS)。您可以通过删除 URL.

中的 ?callback=resp 来获得 JSON 而不是 JSONP