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

Node.js重定向欢迎页报Cannot read property 'auth_token' of undefined如何解决

问题修复方案

核心错误原因

你遇到的TypeError: Cannot read property 'auth_token' of undefined是因为cookieParser中间件加载顺序错误,同时代码还有多个逻辑、语法问题,逐一修复如下:


修复步骤

1. 调整index.js中间件加载顺序

Express的中间件是按书写顺序执行的,你把cookieParser写在路由定义的后面,请求到路由时还没解析cookie,自然没有req.cookies。把中间件注册部分挪到所有路由定义的前面,同时删掉冗余的无效引用:

const express = require('express');
const app = express();
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const cookieParser = require('cookie-parser');
//Import Routes
const authRoute = require('./routes/auth');
const postRoute = require('./routes/posts');
const verifyJsonWebToken = require('./routes/verifyToken');

dotenv.config();

// 【先注册所有中间件】
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({extended: false }))
// 静态资源中间件也提前放
app.use(express.static('public'))
app.use('/css', express.static(__dirname + 'public/css'))

//Set views
app.set('view-engine', 'ejs')

// 【再注册路由】
app.get('/', (req, res) => {
    res.render('index.ejs')
});

app.get('/login', (req, res) => {
    res.render('login.ejs')
});

app.get('/register', (req, res) => {
    res.render('register.ejs')
});

app.get('/welcome', verifyJsonWebToken, (req, res) => {
    res.render('welcome.ejs', { username: 'username'})
});

app.post('/register', authRoute);
app.post('/login', authRoute);

//Route Middlewares
app.use('/api/user', authRoute);
app.use('/api/posts', postRoute);

//Connect to DB
mongoose.connect(
    process.env.DB_CONNECT,
() => console.log('connected to db!')
);

app.listen(3000, () => console.log('Server Up and Running'));

2. 简化verifyToken.js,删掉无效代码

你在verifyToken.js里新建的app实例和主应用完全无关,注册的cookieParser也不会生效,直接删掉这部分冗余代码,同时修复字段取值错误:

const jwt = require('jsonwebtoken');

module.exports = function (req,res,next){
    const token = req.cookies?.auth_token; // 可选链避免属性读取报错
    if (!token) {
        return res.status(403).send('Access Denied');
    }
    try {
        // jwt.sign的时候存储的字段是_id,不是id
        const data = jwt.verify(token, process.env.TOKEN_SECRET);
        req.userId = data._id;
        next();
    } catch(err) {
        // sendStatus会直接结束响应,不能链式调用send,改为status方法
        return res.status(400).send('Invalid Token');
    }
};

3. 修复auth.js login接口的语法和逻辑错误

//Login
router.post('/login', async (req,res) => {
    const {error} = loginValidation(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    //Checking if email exist in database
    const user = await User.findOne({email: req.body.email});
    if(!user) return res.status(400).send('Invalid Email');

    //Check if password is correct
    const validPass = await bcrypt.compare(req.body.password, user.password);
    if(!validPass) return res.status(400).send('Invalid password')
   
    //Creat and assign json web token
    const token = jwt.sign({_id: user._id}, process.env.TOKEN_SECRET);
    // 修复链式调用,去掉错误的逗号分隔,secure配置改为判断NODE_ENV环境变量
    return res
    .cookie("auth_token", token, {
        httpOnly: true,
        secure: process.env.NODE_ENV === "production",
    })
    .redirect('/welcome');
});

module.exports = router;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:30:00