Javascript 忘记了使用NodeJs/Knex/nodeEmailer的密码功能,它无法正常工作
注意:这是我第一次发帖,如果你有反馈,请让我知道 目标:我正在构建一些端点,允许用户在忘记密码时重置密码。流量如下所示:Javascript 忘记了使用NodeJs/Knex/nodeEmailer的密码功能,它无法正常工作,javascript,node.js,knex.js,nodemailer,Javascript,Node.js,Knex.js,Nodemailer,注意:这是我第一次发帖,如果你有反馈,请让我知道 目标:我正在构建一些端点,允许用户在忘记密码时重置密码。流量如下所示: 用户不知道密码,所以他们单击“忘记密码” 用户键入电子邮件并单击发送 用户收到带有重置密码链接的电子邮件。点击链接并被重定向以输入新密码 他们单击“保存”,并被重定向到登录,以使用新密码登录 我用失眠来达到测试的终点 有效的东西: 当提供电子邮件重置密码时,NodeEmailer会发送电子邮件 更新密码时,它会显示“密码已更新”,并给出200状态 错误: 尝试使用该新密
- 当提供电子邮件重置密码时,NodeEmailer会发送电子邮件
- 更新密码时,它会显示“密码已更新”,并给出200状态
- 尝试使用该新密码登录后,它不会保存到数据库。只有旧密码才允许您重新登录
- 我试图更改我的user.model以使用findByEmail函数,但遇到了一些奇怪的错误,这让我陷入了一个棘手的问题中
- 我试着用控制台记录了很多东西,看看是否可以追踪路径
- 我尝试更改user.update函数,但无法使其正常工作
const router=require('express').router();
const crypto=require('crypto')
const User=require(“../models/users.model”)
const nodemailer=require('nodemailer')
路由器.post('/forgotpassword',(req,res)=>{
让{
电子邮件
}=请求正文
控制台日志(请求正文)
//如果(req.body.email===''){
//res.status(400).json({message:'Email是必需的'})
//}console.error(req.body.email)
User.findBy({
电子邮件
})
.first()
。然后(用户=>{
如果(用户===null){
res.status(403).json({
消息:“电子邮件不在数据库中”
})
}否则{
const token=crypto.randomBytes(20).toString('hex'))
User.update({
resetPasswordToken:token,
resetPasswordExpires:Date.now()+3600000,
})
const transporter=nodemailer.createTransport({
服务:“gmail”,
认证:{
用户:`${process.env.EMAIL\u user}`,
通过:`${process.env.EMAIL\u pass}`
}
})
常量邮件选项={
发件人:“${process.env.EMAIL\u USER}”,
收件人:“${user.email}”,
主题:“[Promoquo]重置密码链接”,
text:'您收到此消息是因为您(或其他人)已请求重置您帐户的密码。\n\n'+
'请单击以下链接,或将其粘贴到浏览器中,以便在收到该链接后一小时内完成此过程:\n\n'+
`http://localhost:5000/reset/${token}\n\n`+
'如果您没有请求,请忽略此电子邮件,您的密码将保持不变。\n',
}
transporter.sendMail(mailpoptions,(err,res)=>{
如果(错误){
log('来自忘记密码js的错误,它很糟糕',错误)
}否则{
log('这里是res',res)
res.status(200).json({
消息:“已发送恢复电子邮件,是”
})
}
})
}
res.status(200).json({
消息:“重置密码电子邮件已发送WOOHOO您的用户。update()
行未运行(您需要将其承诺返回到承诺链中,或挂接到其回调中)。async/wait
是您的朋友,以避免“回调地狱”
非常感谢您的回复。我将尝试添加async/Wait,看看会发生什么。您能否澄清一下在MongoDB中使用未初始化的体参数的意思。我没有使用MongoDB,我使用的是SQlite3。感谢您的帮助!我在这方面绝对是新手。已经编写了大约一年的代码。@RyanRenteria没有问题。使用SQlite3我想您是对的We’很好——我错误地假设了MongoDB,对不起。哦,好吧,明白了!非常感谢您的帮助。我今天将对此进行研究,看看会发生什么。:)实际上,还有一个问题。我需要在忘记.password.js和更新.password.js中使用async/await,还是只使用某一个?您应该await
所有数据库操作。这会将结果提交给数据库,这样您就知道(1)数据库成功应用了它,没有模式冲突阻止它保存,等等。(2)不存在并发问题,例如,您无法查询用户并获取过时数据。
const user = await User.find({
where: {
username: req.body.username,
resetPasswordToken: req.body.resetPasswordToken,
resetPasswordExpires: Date.now() + 3600000,
}
})
if (!user) { /* ... */ }
const token = crypto.randomBytes(20).toString('hex')
await User.update({ // await here!
resetPasswordToken: token,
resetPasswordExpires: Date.now() + 3600000,
})