Мы пытаемся создать функцию сброса пароля в Angular 6 с Node.js. Дело в том, что когда вы нажимаете пароль для сброса и заполняете свое письмо, оно отправляет письмо со ссылкой для сброса пароля. Но ссылка внутри письма не связывается с Angular. Мы используем Node.js и Node mailer в бэкэнде. Вот код:
Node.js
async ResetPassword(req, res) {
if (!req.body.email) {
return res
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.json({ message: 'Email is required' });
}
const userEmail = await User.findOne({
email: Helpers.lowerCase(req.body.email)
});
if (!userEmail) {
return res
.status(HttpStatus.CONFLICT)
.json({ message: 'Email does not exist' });
}
const body = {
email: Helpers.lowerCase(value.email),
};
var resettoken = new resetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });
resettoken.save(function (err) {
if (err) { return res.status(500).send({ msg: err.message }); }
var transporter = nodemailer.createTransport({
service: '"SendGrid"',
auth:
{
user: 'login',
pass: 'password'
}
});
var mailOptions = {
from: 'email',
subject: 'Node.js Password Reset',
text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
'http://' + req.headers.host + '/new-password/' + resettoken + '\n\n' +
'If you did not request this, please ignore this email and your password will remain unchanged.\n'
}
transporter.sendMail(mailOptions
)
})
.catch(err => {
res
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.json({ message: 'Error occured' });
});
},
Ссылка внутри почтового шаблона не работает.
Маршрут
router.post('/new-password', AuthCtrl.NewPassword);
Угловая
route.queryParams.subscribe(params => {
this.form.resetToken = params['token'];
});
}
ngOnInit() {
this.Init();
}
Init() {
this.ResponseResetForm = this.fb.group(
{
email: ['', Validators.required, Validators.email],
newPassword: ['', Validators.required],
confirmPassword: ['', Validators.required]
},
{
validator: this.Validate.bind(this)
}
);
}
...
...
ResetPassword() {
this.authService.newPassword(this.ResponseResetForm.value).subscribe(
data => {
this.ResponseResetForm.reset();
setTimeout(() => {
this.router.navigate(['sign-in']);
}, 3000);
},
err => {
if (err.error.message) {
this.errorMessage = err.error.message;
}
}
);
}
}
Эта часть я добавил из другого кода:
route.queryParams.subscribe(params => {
this.form.resetToken = params['token'];
});
}
Но я не думаю, что это подходит для нашего кода. Также вот маршрут для этого компонента в Angular:
{
path: 'response-reset-password',
component: ResponseResetComponent
},
Как мы можем заставить этот бэкэнд-контроллер работать, как ожидается, с Angular front-end?