在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')
}
}
以上方法可以单独使用,也可以组合使用,根据您的具体需求来构建灵活的路由逻辑。