// plugins/cookie.server.ts import { defineNuxtPlugin, useRequestHeaders, useRequestEvent } from '#app' import { parse, serialize } from 'cookie' import type { SerializeOptions } from 'cookie' export default defineNuxtPlugin(() => { const event = useRequestEvent() const headers = useRequestHeaders(['cookie']) // 解析请求中的Cookie const requestCookies = headers.cookie ? parse(headers.cookie) : {} return { provide: { serverCookie: { // 获取Cookie get: (name: string) => { return requestCookies[name] }, // 获取所有Cookie getAll: () => { return { ...requestCookies } }, // 设置Cookie(响应头) set: (name: string, value: string, options: Partial = {}) => { if (event?.node?.res) { const cookie = serialize(name, value, { path: '/', sameSite: 'lax', ...options } as SerializeOptions) // 处理Set-Cookie头 const existingCookies = event.node.res.getHeader('Set-Cookie') let cookiesArray: string[] = [] if (Array.isArray(existingCookies)) { cookiesArray = [...existingCookies] } else if (typeof existingCookies === 'string') { cookiesArray = [existingCookies] } cookiesArray.push(cookie) event.node.res.setHeader('Set-Cookie', cookiesArray) } }, // 删除Cookie remove: (name: string, options: Partial = {}) => { if (event?.node?.res) { const cookie = serialize(name, '', { ...options, maxAge: 0, expires: new Date(0) } as SerializeOptions) const existingCookies = event.node.res.getHeader('Set-Cookie') let cookiesArray: string[] = [] if (Array.isArray(existingCookies)) { cookiesArray = [...existingCookies] } else if (typeof existingCookies === 'string') { cookiesArray = [existingCookies] } cookiesArray.push(cookie) event.node.res.setHeader('Set-Cookie', cookiesArray) } } } } } })