Next.js中jwt.sign报TypeError:instanceof右侧不是对象
TypeError: Right-hand side of 'instanceof' is not an object 解决方法(Next.js + jsonwebtoken v9)
问题详情
在Next.js环境中调用jwt.sign时持续抛出以下错误:
TypeError: Right-hand side of 'instanceof' is not an object
使用的代码如下:
const secret = 'qwerty' const data = { name: 'name', email: 'email', subject: 'subject', message: 'message' } const accessToken = jwt.sign(data, secret.toString('utf-8'), { algorithm: 'HS256', allowInsecureKeySizes: true, allowInvalidAsymmetricKeyTypes: true, expiresIn: '500s' })
已尝试升级所有依赖至最新版本、删除node_modules重新执行npm install、重启npm run dev,但问题依旧。相关环境信息:
jsonwebtoken: ^9.0.0@types/jsonwebtoken: 9.0.1- Node版本: v19.6.0
核心解决步骤
1. 确保代码运行在服务端环境
jsonwebtoken是Node.js专属模块,无法在浏览器客户端环境正常运行。如果你的代码写在带有'use client'标记的组件中,必须迁移到API路由或服务端组件(Next.js 13+ App Router默认服务端渲染,无需额外标记)。
2. 简化Secret参数
你的secret已经是字符串类型,无需调用toString('utf-8'),多余的类型转换可能引发异常,直接传递原始字符串即可。
3. 移除无效配置参数
allowInsecureKeySizes和allowInvalidAsymmetricKeyTypes是针对非对称加密算法(如RS256)的配置,你使用的HS256是对称加密算法,这两个参数完全无效,删除后可避免潜在的类型检查错误。
修正后的代码示例
方案1:在API路由中生成Token
// app/api/generate-token/route.js import jwt from 'jsonwebtoken'; export async function POST() { const secret = 'qwerty'; const data = { name: 'name', email: 'email', subject: 'subject', message: 'message' }; const accessToken = jwt.sign(data, secret, { algorithm: 'HS256', expiresIn: '500s' }); return new Response(JSON.stringify({ accessToken }), { status: 200, headers: { 'Content-Type': 'application/json' } }); }
方案2:在服务端组件中生成Token
// app/page.js (默认服务端渲染组件) import jwt from 'jsonwebtoken'; export default function Home() { const secret = 'qwerty'; const data = { name: 'name', email: 'email', subject: 'subject', message: 'message' }; const accessToken = jwt.sign(data, secret, { algorithm: 'HS256', expiresIn: '500s' }); return <div>Generated Token: {accessToken}</div>; }
额外排查步骤
如果上述方法无效,检查是否存在多版本依赖冲突:
执行以下命令查看依赖树,确认是否有嵌套安装的旧版jsonwebtoken:
npm ls jsonwebtoken
若存在冲突,可通过npm dedupe清理重复依赖,或手动删除package-lock.json后重新安装。
内容的提问来源于stack exchange,提问作者user3117405
相关产品推荐
相关产品推荐

