如何通过表单发布请求更新猫鼬子文档

时间:2020-01-08 02:01:26

标签: node.js mongodb express mongoose

我有一个带有嵌套模式的Schema系统,用于创建一对多关系。

用户架构

const expenseSchema = new Schema({
  expense: String,
  value: Number
});

const budgetSchema = new Schema({
  earnings: Number,
  expenses: [expenseSchema]
});

const userSchema = new Schema({
  username: String,
  name: String,
  googleId: String,
  budget: [budgetSchema]
});

我正在尝试将值推入这些嵌套模式,但是遇到了一些麻烦。 注意,req.user值是通过Passport认证的已认证用户

这是我尝试将数据添加到预算架构的收入属性中。奇怪的是,当我在发布请求后登录用户时,它显示为未定义。

router.post("/", (req, res) => {
  User.findOneAndUpdate(req.user, {
    $push: {
      budget: {
        earnings: req.body.earning
      }
    }
  });
  console.log(req.user);
});

Vue形式

submitBudget() {
  const expenses = this.mergeKeyAndValue();

  axios
    .post("http://localhost:3000/budget", {
      earning: this.earnings,
      expenses
    })
    .then(response => {
      console.log(response.data);
    })
    .catch(e => {
      console.error(e);
    });
}

1 个答案:

答案 0 :(得分:0)

router.post("/", (req, res) => {
 User.findOneAndUpdate(req.user,
 {$push:{
   budget: {
     earnings: req.body.earning
   }
 }

 }
 )
  console.log(req.user);
})

在这里,您没有为User.findOneAndUpdate()提供回调函数,并且没有该函数,您所要做的就是查询数据库而不保存任何内容。

来自猫鼬文档中有关Model.findOneAndUpdate()

的信息
A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options)  // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update)           // returns Query -> This is what you are doing right now.
A.findOneAndUpdate()                             // returns Query

此外,您的语法不正确,这可能就是为什么您不确定的原因。它应该是Users.findOneAndUpdate({ username: req.user },.....或存储请求对象的req.user用户名密钥的任何地方。

您可以通过以下方式使用async / await重写整个函数:

router.post("/", async (req, res) => {
    const update = await User.findOneAndUpdate(
        { username: req.user.username },
        {
            $push: {
                budget: {
                    earnings: req.body.earning
                }
            }
        }
    )
    console.log(update);
});

我没有一种简便的方法来测试$push更新,因此,我假设您知道自己在做什么,但其余的都应按所述进行。