Node.js 这个预钩子保存是如何工作的?

Node.js 这个预钩子保存是如何工作的?,node.js,mongodb,Node.js,Mongodb,我一直在尝试在mongoose中使用populate,我目前的想法是检查MongoDB中是否存在特定的文档,如果存在,则预保存钩子应该检查,而不是创建一个新文档,它应该将其推送到refs,以便我以后可以填充 现在,ref被保存在MongoDB中,但是,如何检查我试图保存的文档是否在mongo中的pre-save中(或任何其他更合适的方法) 这是模式 var Userschmea = new mongoose.Schema({ user:String, posts:[{ type

我一直在尝试在mongoose中使用populate,我目前的想法是检查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);
})

您可以使用带有某个唯一键的
findOne
方法来检查用户是否存在。我在这里使用了
电子邮件

Userschmea.pre('save',(next)=>{
var self=这个;
Userschmea.findOne({email:this.email},'email',函数(err,results){
如果(错误){
下一个(错误);
}如果有的话(结果){
自我失效(“用户”,“用户存在”);
下一步(新错误(“用户已存在”);
}否则{
next();
}
});

})
这个“this”是空的,在这种情况下,不要使用箭头函数,
函数(next){
而不是
(next)=>{
@alpitand,同意上面的评论。请找到更新的答案。还有一件事,如果它不在那里,我需要保存它,如果它在那里,我需要推送一些值。如果找不到文档,预保存将按照当前实现保存文档。第二种情况是如果你想推送一些值,如果文档存在,那么你可以处理它的副捕获异常,它将在预钩子时抛出。或者您可以使用findOneAndUpdate预钩子。