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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:10:26