首页 > 解决方案 > 在 MongoDB/Node.js 中使用 findOneAndUpdate 自动增加值的问题

问题描述

好吧,我正在尝试在节点中进行自动增量。

所以我有一个简单的功能,我在这里找到了如何将自动增量添加到 mongodb/node.js 中的现有集合?

    // Increment DB Value
exports.getNextSequenceValue = async function (sequenceName) {
    try {
        const seqNum = await db.collection('counters').findOneAndUpdate({
            _id: sequenceName
        }, {
            $inc: {
                seq: 1
            }
        }, {
            returnNewDocument: true
        });
        // Check if response has seqNum.seq exists
        console.log(seqNum.value.seq);
        if (seqNum && seqNum.value.seq) {
            return seqNum.value.seq
        } else {
            return 'what ever you want '
        }
    } catch (err) {
        console.error(err)
    }
}

和我使用它的控制器。

const user = new User({
    profile: {
      firstname: req.body.firstname,
      lastname: req.body.lastname,
      location: req.body.location,
      status: 1,
      avatar: "/uploads/avatars/defaultProfilePic.jpg"

    },
    email: req.body.email,
    password: req.body.password,
    xid: core.getNextSequenceValue('userid') // ----HERE ITS FUNCTION-----

  });
  console.log(core.getNextSequenceValue('userid')) //---- [object Promise]X ---
  User.findOne({
    email: req.body.email
  }, (err, existingUser) => {
    if (err) {
      return next(err);
    }
    if (existingUser) {
      req.flash('errors', {
        msg: 'Account with that email address already exists.'
      });
      return res.redirect('/signup');
    }
    user.save((err) => {
      if (err) {
        return next(err);
      }
      req.logIn(user, (err) => {
        if (err) {
          return next(err);
        }
        res.redirect('/');
      });
    });
  });
};

但现在我得到错误。

ValidationError: User validation failed: xid: Cast to Number failed for value "Promise { <pending> }" at path "xid"

不知道如何解决它。谢谢你的帮助。

标签: javascriptnode.jsmongodbmongoose

解决方案


好的,您的问题似乎与new : true您使用时有关findOneAndUpdate(),它必须returnNewDocument: true更多,您需要等待功能,这需要一些时间才能完成,但不是它的响应。请记住始终使用 try-catch 块包装您的 async 和 await。

exports.getNextSequenceValue = async function (sequenceName) {
    try {
        const seqNum = await db.collection('counters').findOneAndUpdate({
            _id: sequenceName
        }, {
                $inc: {
                    seq: 1
                }
            },
            { returnNewDocument: true }
        );
        // Check if response has seqNum.seq exists
        console.log(seqNum.seq);
        if (seqNum && seqNum.seq) { return seqNum.seq } else {
            return 'what ever you want '
        }
    } catch (err) {
        console.error(err)
    }
}

推荐阅读