到目前为止,我总是使用普通的旧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
}
})
有点短,我想知道它是否有更重要的好处。可能是错误处理?
答案 0 :(得分:4)
在浏览器中,XMLHttpRequest
已经内置,因此如果该库为您提供了您认为有用并且值得额外下载的特定功能,您应该只获得一些构建在其上的其他库。为了保持网页尽可能精简,如果你已经内置了已经正常工作的内容,我不会只是为了它而加载新的模块。所以,如果浏览器和请求模块值得你得到的话,这纯粹是对自己的判断。请求模块是一个很好的精简和灵活的界面,所以它具有适应性。
在node.js上,没有内置的实际XMLHttpRequest
对象,所以提供该接口的任何东西都采用类似http
模块的模块,然后构建一个新的XMLHttpRequest
接口在它的上面。 request
模块也在http
模块上构建,但它的使用方式更轻,更简单(我的观点)。因此,在以下三个选项中:1)使用http模块编写代码,2)将XMLHttpRequest模块和代码加载到该接口或3)将请求模块和代码加载到该模块,您可以形成自己对什么是最干净的看法最简单的代码方式。加载服务器端的新模块的问题较少(因为它们通常只是在启动时从本地硬盘加载一次)。我个人觉得request()
模块非常简单,非常实用,所以我用来制作服务器端的http请求。 XMLHttpRequest对象在浏览器中似乎从来就不是一个很棒的界面,所以我没兴趣在服务器端使用它。
request()
模块的一个优点是它遵循node.js异步回调约定,这意味着你可以很容易地将它与promises一起使用(对模块上的Bluebird .promisifyAll()
进行一次调用将获得整个界面的实现版本)许多(我自己包含)发现非常有用于干净地管理异步响应。 XMLHttpRequest
对象不遵循这样的约定,因此必须在它周围放置一个包装器以便与promises一起使用它(在客户端,jQuery.ajax()
是这样一个包装器的示例{ {1}})。
如果有人在客户端和服务器上寻找完全相同的接口,我可能会使用XMLHttpRequest
模块,因为它对我来说似乎比XMLHttpRequest接口更清晰(我的个人观点)。