Node.js+MongoDB注册登录开发遇ReferenceError报错求助
注册流程错误修复及代码优化建议
1. 解决"Cannot access 'User' before initialization"错误
在注册路由中,你用const User声明了局部变量,和顶部导入的User模型重名,触发了变量提升冲突。把实例变量改成小写user即可:
// 原错误代码 const User = new User ({ ...req.body,password: hashedPassword}) await User.save() const payload = { User: { Email:User.Email, }, } // 修改后代码 const user = new User({ ...req.body, password: hashedPassword }) await user.save() const payload = { User: { Email: user.Email, }, }
2. 修复Cookie设置拼写错误
代码中res.cookies()是错误写法,Express的正确方法是res.cookie(),注册和登录路由里的这个错误都要修正:
// 原错误代码 res.cookies("token",token,{ httpOnly: true, }) // 修改后代码 res.cookie("token", token, { httpOnly: true, })
3. 修复Cookie认证中间件逻辑错误
你的cookieAuth.js逻辑颠倒且存在变量作用域问题,修正后代码如下:
const JWT = require("jsonwebtoken"); const cookiesJwtAuth = (req, res, next) => { // 检查cookie中是否存在token const token = req.cookies.token; if (!token) { return res.redirect("/blogs/login"); } try { const decoded = JWT.verify(token, "thisismysecretkey"); req.user = decoded.User; next(); } catch (error) { res.clearCookie("token"); return res.redirect("/blogs/login"); } }; module.exports = cookiesJwtAuth;
4. 登录路由优化
- 增加用户不存在的判断,避免后续代码报错
- 统一密码字段大小写(确保和User模型定义的字段一致)
- 修正payload中的变量引用
app.post("/blogs/login",async(req,res)=>{ const {Email,Password} = req.body; const user = await User.findOne({Email}) // 先检查用户是否存在 if (!user) { return res.redirect("/blogs/signup"); } // 注意:这里的password要和User模型中的字段名一致 const isMatch = await bcrypt.compare(Password, user.password); if (!isMatch){ return res.redirect("/blogs/signup") } const payload = { User: { Email: user.Email, }, } const token = await JWT.sign(payload,"thisismysecretkey",{ expiresIn:"3600", }) res.cookie("token",token,{ httpOnly: true, }) res.redirect("/blogs/create") })
5. 其他小问题修正
- 视图引擎配置错误:
app.set("views engine", "ejs")改为app.set("view engine", "ejs") - 数据库连接catch块增加错误打印,方便排查:
catch(err => console.log("数据库连接失败:", err))
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

