【问题标题】:How this pre hook save works?这个预钩子保存是如何工作的?
【发布时间】:2019-12-03 11:13:42
【问题描述】:

我一直在尝试在 mongoose 中使用填充,我目前的想法是检查 MongoDB 中是否存在特定文档,如果存在,则预保存钩子应该检查而不是创建一个新文档,它应该只是将它推送到 refs,以便我以后可以填充。

现在,ref 被保存在 MongoDB 中,但是,如何检查我要保存的文档是否在 mongo 中的 pre save(或任何其他更合适的方法)

这是架构。

var Userschmea  = new mongoose.Schema({
  user:String,
  posts:[{
    type:mongoose.Schema.Types.ObjectId,
    ref:'Post'
  }]
})


var PostSchema = new mongoose.Schema({
  content:String,
  author:[{
    type:mongoose.Schema.Types.ObjectId,
    ref:'Author'
  }]
})

Userschmea.pre('save',(next)=>{
  //what to do here
  next()
})


var Post = mongoose.model('Post',PostSchema);
var User = mongoose.model('User',Userschmea);

这是我试图保存的端点:

app.post('/save/user',(req,res)=>{
  console.log(req.body);

  //Can i access this in my pre-save
  const newUser  = new User({
    user: req.body.user
  })

  newUser.save((err)=>{

    const newPost = new Post({
      content:req.body.content,
      author: newUser._id
    })

    newPost.save((err)=> {
      if(err) {
        return res.send(err);
      }
    })

    if(err){
      console.log(err);
      return res.send(err);
    }

  })
  return res.send(req.body.user);
})

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您可以使用findOne 方法和一些唯一键来检查用户是否存在。我这里用过email

    Userschmea.pre('save',(next)=>{
      var self = this;
      Userschmea.findOne({email : this.email}, 'email', function(err, results) {
        if(err) {
          next(err);
        } else if(results) {
          self.invalidate("user", "user is exists");
          next(new Error("User is already exists"));
        } else {
          next();
        }
      });
    })

    希望对您有所帮助!

    ====== 更新 =====

    问:this 空了。

    回答:

    函数表达式最适合对象方法,而箭头函数最适合回调或 map、reduce 或 forEach 等方法。

    所以,在这种情况下不要使用箭头函数来访问全局范围。

    【讨论】:

    • “这个”空了
    • 在这种情况下不要使用箭头函数,function(next) { 而不是(next) => {
    • @AlpitAnand,同意上述评论。请找到更新的答案。
    • 还有一件事,如果它不存在,我需要保存它,如果它存在,我需要推送一些值是否可能
    • 如果未找到文档,预保存将按照当前实现保存文档。第二种情况是,如果您想在文档存在的情况下推送一些值,那么您可以通过捕获异常来处理它,该异常将在 pre hook 时抛出。或者你可以使用 findOneAndUpdate pre hook。
    猜你喜欢
    • 2020-11-03
    • 2012-08-08
    • 2014-09-18
    • 2023-01-09
    • 2020-03-09
    • 2018-03-04
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多