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
相关产品推荐
相关产品推荐

