热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解析猫鼬findOne方法返回null的原因

本文探讨了在通过API端点调用时,使用猫鼬(Mongoose)的findOne方法总是返回null的问题,并提供了详细的解决方案和建议。

当您通过 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'
}

您希望只查询 resetPasswordExpiresresetPasswordToken 字段。

问题可能源于 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 官方文档


推荐阅读
author-avatar
安静哒发呆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有