XMLHttpRequest在浏览器中工作,但在节点

时间:2016-12-24 18:28:56

标签: javascript ajax node.js xmlhttprequest

我正在尝试对GitHub的API进行API调用。

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.github.com/search/users?q=mohamed3on");
xhr.onreadystatechange = function () {
    if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
        console.log(xhr.response);
    }
}
xhr.send();

此代码在浏览器中运行时执行并返回JSON文件。

  

{“total_count”:1,“incomplete_results”:false,“items”:[       {         “登录”:“Mohamed3on”,         “id”:12295159,         “avatar_url”:“https://avatars.githubusercontent.com/u/12295159?v=3”,         “gravatar_id”:“”,         “url”:“https://api.github.com/users/Mohamed3on”,         “html_url”:“https://github.com/Mohamed3on”,         “followers_url”:“https://api.github.com/users/Mohamed3on/followers”,         “following_url”:“https://api.github.com/users/Mohamed3on/following {/ other_user}”,         “gists_url”:“https://api.github.com/users/Mohamed3on/gists {/ gist_id}”,         “starred_url”:“https://api.github.com/users/Mohamed3on/starred {/ owner} {/ repo}”,         “subscriptions_url”:“https://api.github.com/users/Mohamed3on/subscriptions”,         “organizations_url”:“https://api.github.com/users/Mohamed3on/orgs”,         “repos_url”:“https://api.github.com/users/Mohamed3on/repos”,         “events_url”:“https://api.github.com/users/Mohamed3on/events {/ privacy}”,         “received_events_url”:“https://api.github.com/users/Mohamed3on/received_events”,         “type”:“User”,         “site_admin”:false,         “得分”:49.68772       }]}

但是,当我在本地运行它时(Webstorm或Node)

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.github.com/search/users?q=mohamed3on");
xhr.onreadystatechange = function () {
    if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
        console.log(xhr.response);
    }
}
xhr.send();

控制台中没有输出任何内容。

2 个答案:

答案 0 :(得分:2)

您应该使用请求模块向服务器发出http / https请求:

p2/1.5

此外,您没有在请求标头中传递用户代理。它在我的系统上工作正常:

var request = require('request-promise');

var aUrl = "https://api.github.com/search/users";

var reqOptions = {
  method: 'GET',
  uri: aUrl,
  qs: {
    q: 'rohankanojia'
  },
  headers: {
    'user-agent': 'node.js'
  },
  json: true
};

request(reqOptions)
  .then(function(parsedBody) {
    console.log("Got response : "+JSON.stringify(parsedBody));
  })
  .catch(function(err) {
    console.log("request failed : "+err);
  });

在客户端做同样的事情:

rohan@~/Documents/src : $ node request.js 
Got response : {"total_count":1,"incomplete_results":false,"items":[{"login":"rohanKanojia","id":13834498,"avatar_url":"https://avatars.githubusercontent.com/u/13834498?v=3","gravatar_id":"","url":"https://api.github.com/users/rohanKanojia","html_url":"https://github.com/rohanKanojia","followers_url":"https://api.github.com/users/rohanKanojia/followers","following_url":"https://api.github.com/users/rohanKanojia/following{/other_user}","gists_url":"https://api.github.com/users/rohanKanojia/gists{/gist_id}","starred_url":"https://api.github.com/users/rohanKanojia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rohanKanojia/subscriptions","organizations_url":"https://api.github.com/users/rohanKanojia/orgs","repos_url":"https://api.github.com/users/rohanKanojia/repos","events_url":"https://api.github.com/users/rohanKanojia/events{/privacy}","received_events_url":"https://api.github.com/users/rohanKanojia/received_events","type":"User","site_admin":false,"score":29.729874}]}

我希望有所帮助。

答案 1 :(得分:0)

首先,对于打算在浏览器中运行的代码,node.js不是一个好的测试环境,它使用的是浏览器功能而不是ECMAScript标准的任何部分。

XMLHttpRequest是一种浏览器功能。它不是Javascript的一部分,也不是node.js的一部分。因此,尝试在使用XMLHttpRequest的node.js中运行代码将无法正常工作,因为该对象不存在。

node.js有http.get()(在http模块中)可以执行HTTP请求,但由于浏览器中不存在,如果您将代码更改为在node.js中运行,则它不会在浏览器中运行。

node.js有一个XMLHttpRequest库,它将在node.js中实现该对象,但如果您正在编写本机node.js代码,那么有很多更好的方法可以生成http请求,例如request()库。

如果您真的想测试打算在浏览器中运行并使用特定于浏览器的功能的代码,那么您可能应该只在浏览器中测试该代码,或者使用旨在模拟浏览器环境的特定产品用于检测。否则,您可能需要进行调整以使特定于浏览器的内容在node.js中运行,然后您不会测试相同的代码。