Cloudflare Workers学习笔记,Cloudflare Workers 是什么?

19,951次阅读
没有评论

共计 2562 个字符,预计需要花费 7 分钟才能阅读完成。

开发文档:https://developers.cloudflare.com/workers/

Cloudflare Workers

Cloudflare Workers 提供了一个 serverless 执行环境,无需配置或维护基础架构即可创建全新的应用程序或扩充现有的应用程序。

特点

每天免费 10w 个请求,可以绑定自己的域名,可以访问外网,可以反代理外网的接口

1. 开发部署

Wrangler 是一个用于 Cloudflare Workers 功能开发、测试、部署的 CLI 工具

相关文档:https://developers.cloudflare.com/workers/wrangler/

2. 使用限制

相关文档:https://developers.cloudflare.com/workers/platform/limits/

Worker 开发

Wordker 底层运行环境跟 Node.js 大致相同,但是只能调用 Cloudflare 提供的 API。

相关案例:https://developers.cloudflare.com/workers/examples/

1. 开发环境

安装 Wrangler Cli,运行如下命令:

# 安装软件包
npm i -D wrangler 
# 初始化开发目录
npx wrangler init
# 运行开发环境
npx wrangler dev

运行后,将自动跳转 Cloudflare 进行授权,然后运行开发服务器。

不想自己搭建的话,也可以直接使用 Cloudflare 后台的在线开发环境。

2. 运行时 API

相关文档:https://developers.cloudflare.com/workers/runtime-apis/

关于 Fetch

Fetch API:https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API

Fetch 提供了对 Request 和 Response(以及其他与网络请求有关的)对象的通用定义。这将在未来更多需要它们的地方使用它们,无论是 service worker、Cache API,又或者是其他处理请求和响应的方式,甚至是任何一种需要你自己在程序中生成响应的方式(即使用计算机程序或者个人编程指令)。

全局的 fetch() 方法用于发起获取资源的请求。它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象。

var myImage = document.querySelector('img');

var myRequest = new Request('flowers.jpg');

fetch(myRequest).then(function(response) {return response.blob();
}).then(function(response) {var objectURL = URL.createObjectURL(response);
  myImage.src = objectURL;
});

功能拓展

1. 反代理 ChatGPT 接口

/* 监听请求事件 */
addEventListener('fetch', event => {event.respondWith(fetchAndApply(event.request));
})

/**
 * 响应请求
 * @param request
 * @return {Promise<"success"|"error">}
 */
async function fetchAndApply(request) {

  let response = null;
  let method = request.method; // 请求方法

  let url = new URL(request.url);
  let url_hostname = url.hostname;
  url.protocol = 'https:';
  url.host = 'api.openai.com';

  let request_headers = request.headers;
  let new_request_headers = new Headers(request_headers);
  new_request_headers.set('Host', url.host);
  new_request_headers.set('Referer', url.protocol + '//' + url_hostname);

  let original_response = await fetch(url.href, {
    method: method,
    headers: new_request_headers,
    body: request.body
  })

  let original_response_clone = original_response.clone();
  let original_text = null;
  let response_headers = original_response.headers;
  let new_response_headers = new Headers(response_headers);
  let status = original_response.status;

  new_response_headers.set('Cache-Control', 'no-store');
  new_response_headers.set('access-control-allow-origin', '*');
  new_response_headers.set('access-control-allow-credentials', true);
  new_response_headers.delete('content-security-policy');
  new_response_headers.delete('content-security-policy-report-only');
  new_response_headers.delete('clear-site-data');

  original_text = original_response_clone.body
  response = new Response(original_text, {
    status,
    headers: new_response_headers
  })

  return response

}

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2023-04-15发表,共计2562字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)