You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt+Prisma项目设置Cookie报错:Cannot read properties of undefined (reading 'getHeader')

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:35:24