Nuxt+Prisma项目设置Cookie报错:Cannot read properties of undefined (reading 'getHeader')
首次使用Nuxt和Prisma搭建项目,在设置Cookie时遇到错误提示:Cannot read properties of undefined (reading 'getHeader'),以下是涉及的登录认证代码和设置Cookie的函数代码:
原登录认证代码
import { sendError } from 'h3' import { createUser } from '~~/server/db/users' import { userTransformer } from '~~/server/transformer/user' export default defineEventHandler(async (event) => { const body = await useBody(event) const { username, email, password, repeatPassword, name } = body if (!username || !email || !password || !repeatPassword || !name) { return sendError(event, createError({ statusCode: 400, statusMessage: "Invalid params" })) } if (password !== repeatPassword) { return sendError(event, createError({ statusCode: 400, statusMessage: "Password not match" })) } const userData = { username, email, password, name, profileImage: 'https://picsum.photos/200/200' } const user = await createUser(userData) return { body: userTransformer(user) } })
原设置Cookie的函数代码
export const sendRefreshToken = (event:any, token:any) => { setCookie(event.res, "refresh_token", token, { httpOnly: true, sameSite: true }) }
错误原因
错误根源在于调用setCookie时传参错误。在Nuxt 3依赖的h3框架中,setCookie的第一个参数需要传入完整的event对象,而非event.res。当传入event.res时,内部API尝试读取getHeader方法,但该方法并不存在于res对象上,因此抛出上述错误。
修复方案
1. 修正sendRefreshToken函数
修改setCookie的第一个参数为event,同时调整sameSite选项为标准字符串值(布尔值可能存在浏览器兼容性问题):
import { setCookie } from 'h3' // 确保导入setCookie export const sendRefreshToken = (event:any, token:any) => { setCookie(event, "refresh_token", token, { httpOnly: true, sameSite: 'lax', // 改为标准字符串值,可选'strict'/'none' path: '/', // 可选:指定Cookie生效路径 maxAge: 60 * 60 * 24 * 7 // 可选:设置过期时间,示例为7天 }) }
2. 在登录接口中调用该函数
原登录代码未调用sendRefreshToken,需要在创建用户后生成refresh token并传入函数,示例如下:
import { sendError } from 'h3' import { createUser } from '~~/server/db/users' import { userTransformer } from '~~/server/transformer/user' import { sendRefreshToken } from '~~/server/utils/your-path' // 替换为函数实际存放路径 import jwt from 'jsonwebtoken' // 假设使用jsonwebtoken生成token export default defineEventHandler(async (event) => { // ... 原有校验逻辑省略 ... const user = await createUser(userData) // 生成refresh token(根据你的JWT配置调整密钥和过期时间) const refreshToken = jwt.sign({ userId: user.id }, process.env.JWT_REFRESH_SECRET, { expiresIn: '7d' }) // 设置refresh token到Cookie sendRefreshToken(event, refreshToken) return { body: userTransformer(user) } })
内容的提问来源于stack exchange,提问作者Pandu
相关产品推荐
相关产品推荐

