我正在构建用于用户身份验证的基于Node Express的API。我正在使用mongo存储数据。使用邮递员,我通过传递以下对象
来提交/ post请求{
"username": "abc",
"password": "abc123",
"email": "abc@ghi.com"
}
在要求正文下。
这是我的/ post函数在代码中的外观:
//create one user
router.post('/createUser', async (req, res) => {
if (!req.body.email || !req.body.password || !req.body.username) {
return res.status(400).send({
message: "No username/password/email specified"
});
}
const newUser = new User({
email: req.body.email,
username: req.body.username,
password: req.body.password
});
await User.create(newUser, (err, data) => {
//res.send(data);
if(err) {
console.log(err);
res.status(500).send('Error creating user');
}
});
});
User.create()方法在后台调用.save()方法。我有保存密码的前提条件。在运行该帖子时,出现错误消息UnhandledPromiseRejectionWarning: Error: data and salt arguments required
我做了一些控制台日志记录,并注意到发生了这种情况,因为user.password是未定义的。因此看来邮递员的请求没有正确处理。
编辑: 这是模式:
const userSchema = new mongoose.Schema({
id: {
type: Number
},
email: {
type: String,
unique: true,
required: true,
},
username: {
type: String,
unique: true,
required: true
},
password: {
type: String,
required: true
},
});
userSchema.pre('save', (next) => {
const user = this;
console.log(user.password);
bcrypt.hash(user.password, 10, (err, hash) => {
if (err) {
next(err);
} else {
user.password = hash;
next();
}
});
});
有人可以帮助我了解问题所在吗?
答案 0 :(得分:1)
您不能在.pre挂钩中使用箭头功能,因为箭头功能不会绑定“ this”。 “ this”应该是指将要保存的每个个人用户。但是,如果在箭头函数中使用“ this”,它将指向全局对象。运行此代码console.log(this),您将看到。将箭头功能用于独立功能。在您的情况下,您正在创建对象的一部分的方法,因此应避免使用箭头功能
我不使用.pre,因为一些猫鼬查询绕过了猫鼬中间件,所以您需要做额外的工作。因此,我改为在路由器内部对密码进行哈希处理,因此与用户相关的所有内容都将放在同一位置。真理的唯一来源
const bcrypt = require("bcrypt");
router.post('/createUser', async (req, res) => {
if (!req.body.email || !req.body.password || !req.body.username) {
return res.status(400).send({
message: "No username/password/email specified"
});
}
const newUser = new User({
email: req.body.email,
username: req.body.username,
password: req.body.password
});
//we created newUser and now we have to hash the password
const salt = await bcrypt.genSalt(10);
newUser.password = await bcrypt.hash(newUser.password, salt);
await newUser.save();
res.status(201).send(newUser)
//201 code success for something is created
});
这是http状态代码的列表:
答案 1 :(得分:0)
您的NodeJS代码收到了邮递员的密码。
在您的代码中:
const newUser = new User({
email: req.body.email,
username: req.body.username,
password: req.body.password
});
执行此操作时,newUser的预期输出将更改。
因此,当您的代码到达此处时...
const user = this;
console.log(user.password);
代替登录user.password 尝试像...那样记录用户本身...
console.log(user)
看看 “(const user = this)”给出了您所期望的。
答案 2 :(得分:0)
signUp: (req, res, next) => {
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(req.body.password, salt, (err, hashedPass) => {
let insertquery = {
'_id': new mongoose.Types.ObjectId(),
'username': req.body.username,
'email': req.body.password,
'salt': salt,
'password': hashedPass
};
user.create(insertquery, function (err, item) {
});
});
});
}