Hono — إطار العمل للويب على معايير الويب › الوسائط المدمجة 3 / 8 السابق التالي

برمجية وسيطة CORS

هناك العديد من حالات الاستخدام لـ Cloudflare Workers كواجهات برمجة تطبيقات ويب (Web APIs) واستدعائها من تطبيقات الواجهة الأمامية الخارجية. لهذا، علينا تنفيذ CORS، فلنفعل ذلك باستخدام وسيط (middleware) أيضًا.

Import

import { Hono } from 'hono'
import { cors } from 'hono/cors'

الاستخدام

const app = new Hono()

// CORS should be called before the route
app.use('/api/*', cors())
app.use(
  '/api2/*',
  cors({
    origin: 'http://example.com',
    allowHeaders: ['X-Custom-Header', 'Upgrade-Insecure-Requests'],
    allowMethods: ['POST', 'GET', 'OPTIONS'],
    exposeHeaders: ['Content-Length', 'X-Kuma-Revision'],
    maxAge: 600,
    credentials: true,
  })
)

app.all('/api/abc', (c) => {
  return c.json({ success: true })
})
app.all('/api2/abc', (c) => {
  return c.json({ success: true })
})

أصول متعددة:

app.use(
  '/api3/*',
  cors({
    origin: ['https://example.com', 'https://example.org'],
  })
)

// Or you can use "function"
app.use(
  '/api4/*',
  cors({
    // `c` is a `Context` object
    origin: (origin, c) => {
      return origin.endsWith('.example.com')
        ? origin
        : 'http://example.com'
    },
  })
)

طرق مسموح بها ديناميكيًا بناءً على الأصل (origin):

app.use(
  '/api5/*',
  cors({
    origin: (origin) =>
      origin === 'https://example.com' ? origin : '*',
    // `c` is a `Context` object
    allowMethods: (origin, c) =>
      origin === 'https://example.com'
        ? ['GET', 'HEAD', 'POST', 'PATCH', 'DELETE']
        : ['GET', 'HEAD'],
  })
)

الخيارات

origin: string | string[] | (origin:string, c:Context) => string

قيمة ترويسة CORS "Access-Control-Allow-Origin". يمكنك أيضًا تمرير دالة استدعاء مثل origin: (origin) => (origin.endsWith('.example.com') ? origin : 'http://example.com'). القيمة الافتراضية هي *.

allowMethods: string[] | (origin:string, c:Context) => string[]

قيمة ترويسة CORS "Access-Control-Allow-Methods". يمكنك أيضًا تمرير دالة استدعاء لتحديد الطرق المسموحة ديناميكيًا بناءً على الأصل (origin). الافتراضي هو ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH', 'QUERY'].

allowHeaders: string[]

قيمة رأس CORS "Access-Control-Allow-Headers". الافتراضي هو [].

maxAge: number

قيمة ترويسة CORS المسماة "Access-Control-Max-Age".

credentials: boolean

قيمة ترويسة (header) CORS "Access-Control-Allow-Credentials".

exposeHeaders: string[]

قيمة رأس CORS "Access-Control-Expose-Headers". الافتراضي هو [].

تكوين CORS المعتمد على البيئة

إذا كنت تريد ضبط إعداد CORS وفقًا لبيئة التنفيذ، مثل بيئة التطوير أو الإنتاج، فحقن القيم من متغيرات البيئة أمر مريح لأنه يلغي حاجة التطبيق إلى معرفة بيئة التنفيذ الخاصة به. راجع المثال أدناه للتوضيح.

app.use('*', async (c, next) => {
  const corsMiddlewareHandler = cors({
    origin: c.env.CORS_ORIGIN,
  })
  return corsMiddlewareHandler(c, next)
})

الاستخدام مع Vite

عند استخدام Hono مع Vite، يجب عليك تعطيل ميزة CORS المدمجة في Vite عن طريق ضبط server.cors إلى false في vite.config.ts. يمنع هذا التعارضات مع وسيطة CORS الخاصة بـ Hono.

// vite.config.ts
import { cloudflare } from '@cloudflare/vite-plugin'
import { defineConfig } from 'vite'

export default defineConfig({
  server: {
    cors: false, // disable Vite's built-in CORS setting
  },
  plugins: [cloudflare()],
})