You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.8 KiB
TypeScript

1 month ago
// 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<SerializeOptions> = {}) => {
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<SerializeOptions> = {}) => {
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)
}
}
}
}
}
})