cloudfare-workers使用方法

  1. 一个简单的dmeo

js

// 1. 在 Cloudflare Workers 中创建一个新的 Worker
// 这个函数为入口函数,相当于main函数。
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

// 3. 处理请求。
// 创建KV并且关联后,可以直接用关联的变量明作为KV对象,使用put或get对KV进行访问。
async function handleRequest(request) {
  if (request.method === 'POST' && request.url.endsWith('/clear-count')) {
    // 清空页面计数
    await PAGE_COUNT.put('page-views', '0')
    return new Response('Page count has been reset.', {
      headers: { 'Content-Type': 'text/plain' },
    })
  }

  // 从 KV 中获取页面计数
  let count = await PAGE_COUNT.get('page-views')

  if (count === null) {
    count = 1
  } else {
    count = parseInt(count, 10) + 1
  }

  // 构建页面内容, 使用let声明遍历那个,使用``将字符串进行包裹。
  let body = `This page has been visited ${count} times. <br><button onclick="clearCount()">Clear Count</button>`

  // 构建响应,使用respone生成对象
  return new Response(body, {
    headers: { 'Content-Type': 'text/html' },
  })
}

// 4. 定义清空计数的函数,使用fetch可以发起请求。
async function clearCount() {
  const response = await fetch('/clear-count', { method: 'POST' })
  const result = await response.text()
  console.log(result)
}

案例来源。 worker.js

  1. 首先来看入口函数。

js

/**
 * Wait for requests to the worker
 */
addEventListener('fetch', event => {
  const url = new URL(event.request.url)
  if (url.pathname === WEBHOOK) {
    event.respondWith(handleWebhook(event))
  } else if (url.pathname === '/registerWebhook') {
    event.respondWith(registerWebhook(event, url, WEBHOOK, SECRET))
  } else if (url.pathname === '/unRegisterWebhook') {
    event.respondWith(unRegisterWebhook(event))
  } else {
    event.respondWith(new Response('No handler for this request'))
  }
})

其中URL() 构造函数返回一个新创建的 URL 对象,该对象表示由参数定义的 URL。各种使用情况如下。

js

// 基准 URL:
let baseUrl = "https://developer.mozilla.org";

let A = new URL("/", baseUrl);
// => 'https://developer.mozilla.org/'

let B = new URL(baseUrl);
// => 'https://developer.mozilla.org/'

new URL("en-US/docs", B);
// => 'https://developer.mozilla.org/en-US/docs'

let D = new URL("/en-US/docs", B);
// => 'https://developer.mozilla.org/en-US/docs'

new URL("/en-US/docs", D);
// => 'https://developer.mozilla.org/en-US/docs'

new URL("/en-US/docs", A);
// => 'https://developer.mozilla.org/en-US/docs'

new URL("/en-US/docs", "https://developer.mozilla.org/fr-FR/toto");
// => 'https://developer.mozilla.org/en-US/docs'

总结一下就是第一个参数是路径,与第二个参数的主机名拼接后得到新的URL。 2. 程序要求我们首先通过打开https://xxx.workers.dev/registerWebhook来注册websoket,因此我们先看对于/registerWebhook请求是如何处理的。代码为event.respondWith(registerWebhook(event, url, WEBHOOK, SECRET)), 可以看到是调用了下面这个函数。

js

/**
* Set webhook to this worker's url
* https://core.telegram.org/bots/api## setwebhook
*/
async function registerWebhook (event, requestUrl, suffix, secret) {
// https://core.telegram.org/bots/api## setwebhook
const webhookUrl = `${requestUrl.protocol}//${requestUrl.hostname}${suffix}`
const r = await (await fetch(apiUrl('setWebhook', { url: webhookUrl, secret_token: secret }))).json()
return new Response('ok' in r && r.ok ? 'Ok' : JSON.stringify(r, null, 2))
}
  1. 基本看完了,js编程很好玩。