简单 GET 请求的 npm 请求与 XMLHttpRequest

npm request vs. XMLHttpRequest for simple GET requests

到目前为止,我一直使用普通的旧 XMLHttpRequest 进行 GET 请求,例如,

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function() {
  if (this.status === 200) {
    // do something
  } else {
    // do something else
  }
};
xhr.send(null);

我现在遇到了 request 并且看到它非常受欢迎。相当于

var request = require('request');
request(url, function (error, response, body) {
  if (!error && response.statusCode === 200) {
    // do something
  } else {
    // do something else
  }
})

有点短,我想知道它是否有任何更重要的好处。可能处理错误?

在浏览器中,XMLHttpRequest 已经内置,因此如果该库提供您认为有用且值得额外下载的特定功能,您应该只获取构建在它之上的其他库。为了使网页尽可能精简,如果您已经内置了一些已经可以正常工作的东西,我不会只是为了它而加载新模块。所以,如果 browserify 和请求模块值得你得到,那纯粹是你自己的判断。请求模块是一个很好的精简和灵活的接口,所以它有它的用武之地。

在 node.js 上,没有实际的 XMLHttpRequest 内置对象,因此提供该接口的任何东西都采用 http 模块之类的模块,然后构建一个新的 XMLHttpRequest 界面在它上面。 request 模块也是建立在 http 模块的基础上的,但是它以更轻量级和更易于使用的方式实现(我的观点)。因此,在这三个选择中:1) 使用 http 模块自己编写代码,2) 加载 XMLHttpRequest 模块并将代码加载到该接口或 3) 加载请求模块和代码,您可以就什么是最干净的形成自己的意见和最简单的编码方式。在服务器端加载新模块的问题较少(因为它们通常只在启动时从本地硬盘加载一次)。我个人认为 request() 模块非常简单且非常实用,所以我用它来发出服务器端 http 请求。 XMLHttpRequest 对象在浏览器中似乎从来都不是一个很好的接口,所以我没有兴趣在服务器端使用它。

request() 模块的一个优点是它遵循 node.js 异步回调约定,这意味着您可以很容易地使用它和 promises(一次调用类似 Bluebird .promisifyAll() 在模块上将为您提供整个界面的承诺版本),许多人(包括我自己)发现这对于干净地管理异步响应非常有用。 XMLHttpRequest 对象不遵循这样的约定,因此必须在它周围放置一个包装器才能干净地使用它的承诺(在客户端,jQuery.ajax() 是围绕 XMLHttpRequest).

如果要在客户端和服务器上寻找完全相同的接口,我可能会选择 request() 模块,因为在我看来它比 XMLHttpRequest 接口更干净(我个人的意见)。