我有一个具有MongoDB连接的简单快递应用程序,可以在其中注册用户。注册以及登录和注销都可以,但是现在我正尝试增加编辑用户数据的可能性。我的代码没有引发任何错误,但也没有更新数据库中的数据。
我试图阅读MongoDB文档以及stackoverflow中的类似问题。但是我似乎无法正常工作。
这是我的更新路线:
User.updateOne({ id: req.session.passport.user}, {
name: req.body.name,
email: req.body.email,
password: req.body.password
}, function (err, user){
if (err) return next(err);
User.findById(req.user._id, function(err, user) {
if (err) return next(err);
return res.render('user', {
name: user.name,
email: user.email
});
});
});
});
我希望它更新我的数据库数据,但它只会呈现用户-page,什么也没发生。
编辑。 谢谢您的回答,我尝试了这些方法,但是仍然可以解决,但是数据库中什么也没有发生。 我还尝试根据处理注册的方式来进行编辑,实际上我是用它来保存数据的,但是此解决方案的问题是它不对密码进行哈希处理,而是将其保存为字符串D b。使用注册哈希可以正常工作。我还需要以其他方式进行电子邮件验证,因为现在它要求每次编辑数据时都要对其进行更改。这是代码:
router.post('/update/:name', ensureAuthenticated, function(req, res, next){
const { name, email, password, password2 } = req.body;
let errors = [];
//check required fields
if (!name || !email || !password || !password2) {
errors.push({ msg: 'Please fill in all fields' });
}
//check passwords match
if (password !== password2) {
errors.push({ msg: 'Passwords do not match' });
}
//check pass length
if (password.length < 6) {
errors.push({ msg: 'Password should be at least 6 characters' });
}
if (errors.length > 0) {
res.render('update', {
errors,
name,
email,
password,
password2
});
} else {
//validation passed
User.updateOne({ name: name, email: email, password: password })
.then(user => {
if (user) {
//user exists
errors.push({ msg: 'Email is already registered'});
res.render('update', {
errors,
name,
email,
password,
password2
});
} else {
const updateUser = new User({
name,
email,
password
});
//Hash password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(updateUser.password, salt, (err, hash) => {
if (err) throw err;
//set password to hashed
updateUser.password = hash;
//save user
updateUser
.save()
.then(user => {
req.flash('success_msg', 'Info updatet, log in');
res.redirect('/users/login');
})
.catch(err => console.log(err));
}));
}
});
}
});
答案 0 :(得分:0)
您需要使用 SET 来更新文档
User.updateOne({ id: req.session.passport.user},
{ $set:
{
name: req.body.name,
email: req.body.email,
password: req.body.password
}
}, function (err, user){
if (err) return next(err);
User.findById(req.user._id, function(err, user) {
if (err) return next(err);
return res.render('user', {
name: user.name,
email: user.email
});
});
});
答案 1 :(得分:0)
在这种情况下使用public String sayHello(){
return "Hello Maven";
}
public static void mian(String[] args){
System.out.print(new HelloWorld().sayHello());
}
更好
findByIdAndUpdate
答案 2 :(得分:0)
使用这种简单的情况更好。
data=user.find({ id: req.session.passport.user})
user.update({id:data.id},{name: req.body.name,email: req.body.email,password: req.body.password},
(err,user)=>{
//handle error
});
答案 3 :(得分:0)
您需要对已修改的属性及其值使用$set
选项。还请注意id
参数,在我的情况下为ObjectId
。在您的情况下,可能是自动编号或其他内容。无论如何,您都需要传递_id
而不是id
值。
> db.users.find()
{ "_id" : ObjectId("5ceba75af8372745b2f6b861"), "name" : "allen", "email" : "email@gmail.com", "pass" : "kdsjds" }
{ "_id" : ObjectId("5ceba76cf8372745b2f6b862"), "name" : "sasmal", "email" : "sasmal@gmail.com", "pass" : "abc" }
如果您按照问题中提到的方式仅使用id属性,则不会更新记录。
> db.users.updateOne({id: ObjectId("5ceba75af8372745b2f6b861")}, { $set: {name: 'update', email: 'update@gmail.com', pass:'pass'}});
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
它说它承认了,但是不能匹配或修改任何东西。
但是,如果您将id
更改为_id
,则会看到消息中的变化
> db.users.updateOne({_id: ObjectId("5ceba75af8372745b2f6b861")}, { $set: {name: 'update', email: 'update@gmail.com', pass:'pass'}});
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
现在,让我们验证它是否更改了数据库中的值。
> db.users.find().pretty()
{
"_id" : ObjectId("5ceba75af8372745b2f6b861"),
"name" : "update",
"email" : "update@gmail.com",
"pass" : "pass"
}
{
"_id" : ObjectId("5ceba76cf8372745b2f6b862"),
"name" : "sasmal",
"email" : "sasmal@gmail.com",
"pass" : "abc"
}
注意:我在这里使用过mongo shell,如果您将mongodb js驱动程序用于nodejs,则一切相同。
希望有帮助!