Node.js终于有了Fetch API


Fetch API 由来已久,它的推出预示着一个实时和交互式网页的新时代。2022 年 2 月 1 日,Node.js 核心团队合并了一个拉取请求,将 Fetch API添加到Node.js。
 
2015年,Fetch API作为XMLHttpRequest的现代继承者被推出,它随后成为在Web应用中进行异步调用的事实标准。
与XMLHttpRequest相比,Fetch的一个显著优势是: 使用了promises,允许一个更简单、更干净的API,同时避免了回调地狱。

尽管Fetch API已经存在了一段时间,但由于一些限制,它还没有被纳入Node.js的核心。
在Hacker News上一个由Node核心贡献者回答的问题中指出,浏览器的Fetch API实现依赖于基于浏览器的Web Streams API和AbortController接口(用于中止获取请求),直到最近Node.js中才有这个AbortController接口。

在增加Fetch API之前,请求模块request module 是Node中进行HTTP请求的最流行方法。
但是,整个JavaScript生态系统迅速发展,新引入的模式使request过时了:一个重要例子是async/await;
request API中没有这方面的规定,而且由于这些限制,该项目后来被废弃了。

2018年,Undici作为Node.js的一个更新更快的HTTP/1.1客户端被推出,支持管道和池等功能。经过核心团队的努力工作,Undici使Node.js中的fetch()实现成为可能。
 
如何使用Fetch
Fetch API是作为一个高级函数提供的,在其最基本的版本中,它接收一个URL并产生一个promise ,此promise可解析为响应。

fetch("http://example.com/api/endpoint")
  .then((response) => {
    // Do something with response
  })
  .catch(function (err) {
    console.log("Unable to fetch -", err);
  });

你也可以通过在URL后面附加一个可选的对象来改变获取过程的执行方式,这允许你改变诸如请求方法、请求头信息和其他选项。请求的响应是一个对象,它包含了我们请求的返回元数据,它由响应数据、头信息、请求日期等元素组成。
 
Fetch 已经作为 Node v17 中的实验性功能提供。如果您有兴趣在主版本之前试用它,您需要先下载Node.js 版本并将其升级到 17.5