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

开发文档: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

}