Node.js操作MongoDB查询报错:无法读取null的password属性
问题根因
报错TypeError: Cannot read property 'password' of null的直接原因是admins.findOne(query)没有匹配到任何文档,返回了null,直接对null取password属性就触发了类型错误。
常见触发场景
- 传入函数的
username参数和数据库中存储的username值不完全匹配:存在大小写差异、前后夹带不可见空格、拼写错误 admins集合对象指向错误:虽然数据库连接正常,但绑定的不是存储管理员账号的目标库/目标集合- 异常捕获逻辑位置错误:把
await admins.findOne(query)写在了try块外面,查询阶段抛出的异常不会被捕获,只会在读取null属性时触发报错,容易误导排查方向。
修正代码
async function getAdminPassword(username) { const query = { username: username } try { // 把数据库查询操作放进try块,才能捕获查询阶段的异常 const user = await admins.findOne(query); // 先判断查询结果是否存在,再读取属性 if (!user) { console.log(`未匹配到用户名为【${username}】的管理员账号`); return null; } return user.password } catch (err) { console.log('管理员账号查询异常:', err); return null; } }
排查步骤
- 先在函数入口打印传入的
username参数,确认值和数据库中存储的账号名完全一致,无格式问题 - 写死查询条件做测试:执行
await admins.findOne({username: 'isaiah'})打印结果,确认admins集合确实能查到目标管理员文档,排除连错库、选错集合的问题 - 若写死条件能查到结果,就说明是动态传入的
username参数值存在问题,逐行校验参数传递链路即可。
内容的提问来源于stack exchange,提问作者isaiah day
相关产品推荐
相关产品推荐

