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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:03:13