【问题标题】:How to update user data in MongoDB using node.js如何使用 node.js 更新 MongoDB 中的用户数据
【发布时间】:2019-10-12 17:38:00
【问题描述】:

我有一个带有 MongoDB 连接的简单快速应用程序,我可以在其中注册用户。注册和登录和注销工作正常,但现在我正在尝试增加编辑用户数据的可能性。我的代码没有抛出任何错误,但也没有更新数据库中的数据。

我尝试从 stackoverflow 阅读 MongoDB 文档和类似问题。但我似乎无法让它工作。

这是我的更新路线:

    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
        });
    });
});
});

我希望它更新我的数据库数据,但它只是呈现用户页面,没有其他任何事情发生。

编辑。 谢谢你的回答,我试过了,但它仍然只是通过,但数据库中没有任何反应。 我还尝试根据我处理注册的方式进行编辑,实际上我得到了它来保存数据,但我对这个解决方案的问题是它没有散列密码,它被保存为我的字符串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));
          }));
        }
      });
  }
});

【问题讨论】:

标签: javascript node.js mongodb


【解决方案1】:

您需要使用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
            });
        });
});

【讨论】:

    【解决方案2】:

    在这种情况下使用findByIdAndUpdate更好

    User.findByIdAndUpdate(req.session.passport.user, 
    {
       $set : {
            name: req.body.name,
            email: req.body.email,
            password: req.body.password
        }
    },
    (err, user) => {
         // Some handle 
       }
    );
    

    【讨论】:

      【解决方案3】:

      使用这种简单的情况会更好。

      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
      });
      

      【讨论】:

        【解决方案4】:

        您需要将$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 驱动程序,那么一切都是一样的。

        希望对你有帮助!

        【讨论】:

        • 由于某种原因我无法完成这项工作,仍然没有更新数据库中的数据。但我想我会尝试使用我在第一条消息中编辑的代码来解决这个问题。它已经编辑了 db 中的数据,但它也复制了它,并且在复制的文档中,密码保存为字符串,哈希在那里还不起作用。感谢您尝试帮助我解决这个问题!
        • 你可以使用vscode编辑器来调试它。这样做很容易。
        猜你喜欢
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2021-06-01
        • 2019-06-23
        • 2014-10-31
        • 2017-05-23
        • 2023-03-13
        • 2019-08-04
        相关资源
        最近更新 更多