在cloudflare的worker函数中,如何实现根据不同的请求返回不同的结果

80 阅读1分钟

在Cloudflare Worker中,您可以通过检查请求的各种属性(如URL、请求头、方法等)来决定返回不同的响应。以下是几种常见的实现方式:

1. 基于URL路径的路由

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url)
  
  if (url.pathname === '/api') {
    return new Response('API响应', { status: 200 })
  } else if (url.pathname === '/about') {
    return new Response('关于页面', { status: 200 })
  } else if (url.pathname.startsWith('/users/')) {
    const userId = url.pathname.split('/')[2]
    return new Response(`用户ID: ${userId}`, { status: 200 })
  } else {
    return new Response('未找到页面', { status: 404 })
  }
}

2. 基于请求方法的路由

async function handleRequest(request) {
  if (request.method === 'GET') {
    return new Response('GET请求', { status: 200 })
  } else if (request.method === 'POST') {
    const data = await request.json()
    return new Response(JSON.stringify(data), { 
      status: 200,
      headers: { 'Content-Type': 'application/json' }
    })
  } else {
    return new Response('方法不允许', { status: 405 })
  }
}

3. 基于请求头的路由

async function handleRequest(request) {
  const acceptHeader = request.headers.get('Accept')
  
  if (acceptHeader.includes('application/json')) {
    return new Response(JSON.stringify({ message: 'JSON响应' }), {
      headers: { 'Content-Type': 'application/json' }
    })
  } else {
    return new Response('HTML响应', {
      headers: { 'Content-Type': 'text/html' }
    })
  }
}

4. 使用URL查询参数

async function handleRequest(request) {
  const url = new URL(request.url)
  const lang = url.searchParams.get('lang') || 'en'
  
  const responses = {
    en: 'Hello',
    es: 'Hola',
    fr: 'Bonjour'
  }
  
  return new Response(responses[lang] || responses.en, { status: 200 })
}

5. 更复杂的路由处理

对于更复杂的应用,您可以使用第三方路由库如itty-router

import { Router } from 'itty-router'

const router = Router()

router
  .get('/api', () => new Response('API响应'))
  .post('/api/data', async request => {
    const data = await request.json()
    return new Response(JSON.stringify(data))
  })
  .get('/user/:id', ({ params }) => new Response(`用户ID: ${params.id}`))
  .all('*', () => new Response('未找到', { status: 404 }))

addEventListener('fetch', event => {
  event.respondWith(router.handle(event.request))
})

6. 根据地理位置返回不同内容

Cloudflare Worker还可以访问请求的地理位置信息:

async function handleRequest(request) {
  const country = request.cf.country
  
  if (country === 'CN') {
    return new Response('中国用户欢迎您')
  } else if (country === 'US') {
    return new Response('Welcome, US user')
  } else {
    return new Response('Hello, world')
  }
}

以上方法可以单独使用,也可以组合使用,根据您的具体需求来构建灵活的路由逻辑。