登录时报错Cannot read properties of null (reading 'password')的解决咨询
解决登录报错:Cannot read properties of null (reading 'password')
错误原因
当用户输入的邮箱未在数据库中注册时,User.findOne()返回的foundResults为null,此时直接访问foundResults.password就会触发该错误。
修复步骤
- 先判断用户是否存在
在检查密码前,先确认foundResults不为null,避免读取null的属性。 - 修复服务器启动语法错误
原代码中app.listen(port),()=>{...}的逗号是语法错误,应该改为括号包裹回调函数。 - (可选但强烈建议)加密存储密码
明文存储密码存在严重安全隐患,推荐使用bcrypt对密码进行哈希处理后再存入数据库。
修改后的完整代码
const express = require("express"); const mongoose = require("mongoose"); const bodyparser = require("body-parser"); const path = require("path"); const bcrypt = require("bcrypt"); // 新增bcrypt用于密码加密 const User = require("./db/User"); require("./db/config"); const app = express(); const port = process.env.PORT || 3000; app.get('/register', (req,res)=> { res.sendFile(__dirname + '/public/register.html') }); app.set('view engine', 'ejs'); app.get('/login', (req,res)=> { res.sendFile(__dirname + '/public/login.html') }); app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyparser.json()); app.use(bodyparser.urlencoded({extended:false})) // 注册接口:密码加密后存储 app.post("/registration", async(req,res)=> { // 对密码进行哈希处理 const hashedPassword = await bcrypt.hash(req.body.password, 10); const registerData = new User({ email: req.body.email, username: req.body.username, password: hashedPassword }); await registerData.save(); res.render("homepage"); // ejs渲染不需要加.html后缀 }); // 登录接口:修复null判断+密码校验 app.post("/login", async(req,res)=> { const email = req.body.email; const password = req.body.password; try { const foundResults = await User.findOne({email:email}); if (!foundResults) { return res.send("该邮箱未注册"); } // 对比哈希密码 const isPasswordValid = await bcrypt.compare(password, foundResults.password); if (isPasswordValid) { res.send('You logged in!') } else { res.send("密码错误") } } catch (err) { console.log(err); res.status(500).send("服务器出错"); } }); // 修复listen语法错误 app.listen(port, ()=> { console.log(`Server running on port ${port}`); });
关键修改说明
- 登录接口中,先判断
foundResults是否存在,不存在则直接返回“该邮箱未注册”,避免后续读取password的错误。 - 使用
async/await替代回调函数,代码更简洁,错误处理更统一。 - 新增
bcrypt加密密码,解决明文存储的安全问题,登录时用bcrypt.compare对比密码。 - 修复了
app.listen的语法错误,确保服务器能正常启动。 - 修正了
res.render的参数,ejs模板不需要加.html后缀。
内容的提问来源于stack exchange,提问作者Ash Jonathan
相关产品推荐
相关产品推荐

