Deno 是一个新兴的 JavaScript 和 TypeScript 运行时环境,它提供更安全可靠的环境和更好的模块化支持,因此越来越受到前端开发者的关注。不过,Deno 在处理请求代理时可能出现问题,这个问题在开发过程中可能比较常见,下面我们将详细介绍如何解决这个问题。
问题描述
在 Deno 中,使用 Fetch API 发送 HTTP 请求时,并不能直接使用代理请求,否则会报错。例如,我们可以这样发送一个请求:
const response = await fetch('https://www.baidu.com'); const text = await response.text(); console.log(text);
这个请求并没有使用代理,而如果我们希望使用代理,需要进行如下设置:
const response = await fetch('https://www.baidu.com', { headers: { 'Proxy-Authorization': 'Basic ' + btoa('user:password') } }); const text = await response.text(); console.log(text);
对于使用代理这种情况,Deno 提供了一个工具函数:
-- -------------------- ---- ------- ------ - ----- - ---- ------------------------------------- ------ - ----- - ---- --------------------------------------- ----- ----------- - --------------------------------- ----- -------- - ----- ------------------------------ - -------- - ---------------------- ------ - - --------------------- -- -------- ----------- --- ----- ---- - ----- ---------------- ------------------
这里使用了标准库中的 proxy
函数创建了一个代理服务器,然后将代理服务器作为请求参数传递给 fetch
,这样就可以使用代理了。但是,你可能会遇到一个错误:
Uncaught TypeError: Only absolute URLs are supported at new Request (deno:core/core.js:67:13) at createHttpFetch (deno:core/core.js:221:9) at Object.fetch (deno:core/core.js:239:12) at fetchWithProxy (file:///proxy.ts:5:15) at file:///proxy.ts:11:10
这个错误告诉我们只能使用绝对 URL,不能使用相对路径,而且代理地址也一定要使用绝对地址。
解决方案
解决这个问题有两种方法:
方法一:使用 URL
对象
我们可以使用 URL 对象将相对地址转换为绝对地址。例如,如果之前我们的请求代码是这样的:
const response = await fetch('/api/users'); const text = await response.text(); console.log(text);
那么我们可以改为:
const response = await fetch(new URL('/api/users', 'https://www.example.com').toString()); const text = await response.text(); console.log(text);
这个方法比较繁琐,但是很实用,而且还可以更好的控制请求的地址和参数。
方法二:使用 ProxyAgent
库
我们可以使用 ProxyAgent
库来解决这个问题。这个库是一个基于标准库的 HTTP 代理客户端,可以用于发送 HTTP/HTTPS 请求。
首先我们需要安装这个库:
deno install --allow-net --unstable https://deno.land/x/proxy_agent/proxy_agent.ts
然后我们来修改之前的代码:
-- -------------------- ---- ------- ------ - ---------- - ---- ----------------------------------------- ----- -------- - ----- ------------------------------ - -------- - ---------------------- ------ - - --------------------- -- ------ --- ------------------------------------- --- ----- ---- - ----- ---------------- ------------------
这里使用 agent
参数来指定代理客户端,然后使用 ProxyAgent
创建客户端对象,并指定代理地址。这种方法比较简单,而且功能完整,可以用于各种场景。
总结
以上是解决 Deno 中请求代理出错的两种方法,第一种方法比较繁琐但是更加灵活,可以用于更复杂的场景,第二种方法则更加简单,并提供基于标准库的完整代理功能,可以用于各种业务需求。希望本文能够帮助使用 Deno 的开发者解决问题,并更加深入的理解 Deno 的工作原理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64646c3e968c7c53b0548fbc