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

Express+JWT应用本地正常家庭服务器报TypeError: instanceof右侧非对象

问题诊断与修复方案

核心错误点分析

从报错栈和代码来看,三个关键问题导致了部署后的错误:

  1. JWT签名Payload的类型兼容性问题
    报错指向jsonwebtoken的sign方法中instanceof检查失败,原因是直接将字符串username作为第一个参数传入jwt.sign。虽然文档允许字符串作为Payload,但部分版本对字符串Payload的类型处理存在兼容性问题,触发了类型检查错误。

  2. 未定义变量引用错误
    在/login路由的回调中,接收的token变量名为token,但后续错误使用了未定义的accessToken变量,会导致额外运行时错误。

  3. 端口赋值逻辑错误
    const port = 3000 || process.env.PORT会导致环境变量PORT永远无效,因为3000是真值,会直接覆盖环境变量的值。

修正后的代码

const cors = require('cors');
const express = require('express');
const bodyParser = require('body-parser');

const server = express();
// 修正端口逻辑,优先使用环境变量
const port = process.env.PORT || 3000;

server.options('*', cors());
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: false }));

const jwt = require('jsonwebtoken');

server.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

const posts = [
    {
        user: 'david',
        title: 'post'
    },
    {
        user: 'bryan',
        title: 'post2'
    }
];

server.get('/posts', authenticateToken, (req, response) => {
 response.json(posts.filter(post => post.user === req.user));
});

server.post('/login', (req, res) => {
    const {username, password} = req.body;
    if(username == null) return res.sendStatus(401);

    // 将username包装为对象作为Payload,解决类型检查问题
    jwt.sign({ username }, 'test', (err, token) => {
        if(err) {
            console.log(err);
            return res.sendStatus(403);
        }
    
        // 使用正确的token变量
        console.log(token);
        res.json({accessToken: token});
    });
});

function authenticateToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];

    if(token == null) return res.sendStatus(401);
    jwt.verify(token, 'test', (err, user) => {
        if(err) return res.sendStatus(403);
        // 因Payload改为对象,需取出username赋值
        req.user = user.username;
        next();
    });
}

额外说明

  • Payload改为对象后,authenticateToken函数中需从user对象取出username赋值给req.user,否则帖子过滤逻辑会失效。
  • 部署环境建议用环境变量存储JWT密钥(如process.env.JWT_SECRET),不要硬编码'test',提升安全性。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:35:37