node.js - 用户未在 Node.js Express 控制器功能中定义
问题描述
当我单击重置密码按钮时,它会抛出用户未在后端的命令提示符中定义。我将 Mongoose 与 Node.js Express 一起使用。这是模型和控制器的代码。
控制器
const User = require('../models/userModels');
const passwordResetToken = require('../models/resettokenModels');
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' });
}
var resettoken = new passwordResetToken({ _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: 'email',
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 + '/reset/' + 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' });
});
},
这是模型
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const resettokenSchema = new mongoose.Schema({
_userId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' },
resettoken: { type: String, required: true },
createdAt: { type: Date, required: true, default: Date.now, expires: 43200 },
});
module.exports = mongoose.model('passwordResetToken', resettokenSchema);
用户型号
const userSchema = new mongoose.Schema({
username: { type: String },
email: { type: String },
password: { type: String },
...
...
控制器内的这一行显示错误
var resettoken = new passwordResetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });
什么会导致这样的问题?
解决方案
如评论中所述,您没有将用户设置为任何内容。
编辑:
这是使用您的用户架构,您已经在上面显示用户架构具有用户名、电子邮件、密码等。
const user = await User.findOne({
email: Helpers.lowerCase(req.body.email)
});
您的重置令牌需要这样做:
var resettoken = new passwordResetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });
您的 nodemailer 需要这样做:
var mailOptions = {
from: 'mail@mail.com',
to: user.email,
subject: 'Node.js Password Reset',
text: 'some message'
}
transporter.sendMail(mailOptions)
推荐阅读
- c - GCC 局部结构与单个变量和 PGO 优化
- php - 使用 RegEx 突出显示阿拉伯语文本
- regex - 使用 sed 和 RegEx 格式化 11 位数字
- php - Laravel Jetstream 自定义身份验证登录过程通过请求
- vue.js - 使用来自远程服务器的数据填充 vue 公式下拉列表
- php - 树莓派 3,apache2 php 脚本的浏览器权限
- python - 浏览器不安全,在 selenium python 上使用 user:pass@ip:port 代理
- javascript - 在 Angular 9 中集成 Hubspot 跟踪页面视图
- python - 从python中两个字符串之间的数据(字节)切片
- ffmpeg - ffmpeg - 从一个创建两个音频流