作者:安静哒发呆 | 来源:互联网 | 2024-12-25 17:40
当您通过 Postman 或其他工具调用 API 端点时,可能会遇到猫鼬 findOne
方法返回 null
的情况。以下是具体代码示例及其解释:
exports.updateUserPassword = async (req, res) => {
const user = await User.findOne({
resetPasswordExpires: { $gt: Date.now() },
resetPasswordToken: req.params.token
});
if (!user) {
return res.json({ msg: '密码无效或已过期' });
}
}
在终端上打印出的日志如下所示:
{
_id: 5e4553309d0e232a60gc8b6a,
username: 'Dan_rey',
userType: 'Group',
email: 'dan123@gmail.com',
password: '$2b$10$lq6BYYckKkOtY.as.EILMe7a.njPyBrHauxMlFfianxmSwdmiAT12',
date: 2019-12-29T19:49:04.608Z,
__v: 0,
resetPasswordExpires: 2019-12-30T19:04:05.874Z,
resetPasswordToken: '65bc534656b321907c5af968b13d0a44f41de73b'
}
您希望只查询 resetPasswordExpires
和 resetPasswordToken
字段。
问题可能源于 Date.now()
返回的时间戳格式与存储在数据库中的日期格式不匹配。MongoDB 中存储的日期通常是 ISO 格式的日期对象,而 Date.now()
返回的是纪元时间戳(毫秒)。为了确保查询条件正确,应使用 new Date()
替代 Date.now()
。
例如:
const user = await User.findOne({
resetPasswordExpires: { $gt: new Date() },
resetPasswordToken: req.params.token
});
为了验证这一点,您可以插入以下文档到 MongoDB 中进行测试:
{
"_id": ObjectId("5e4553309d0e232a60gc8b6a"),
"username": "Dan_rey",
"userType": "Group",
"email": "dan123@gmail.com",
"password": "$2b$10$lq6BYYckKkOtY.as.EILMe7a.njPyBrHauxMlFfianxmSwdmiAT12",
"date": ISODate("2019-12-29T19:49:04.608Z"),
"__v": 0,
"resetPasswordExpires": ISODate("2019-12-30T19:04:05.874Z"),
"resetPasswordToken": "65bc534656b321907c5af968b13d0a44f41de73b"
}
有关更多信息,请参考:MongoDB 官方文档。