0

我想在我的预保存回调中增加一个计数器。我发现这个 stackoverflow 非常有用: Mongoose 是否支持 Mongodb `findAndModify` 方法?

我想做的是使用 findAndModify 方法。但是当我实现静态时,我的回调顺序并不像预期的那样。我总是预先保存然后执行 findAndModify 但我想在预保存挂钩的开始和结束之间执行 findAndModify。如果我定义一个带有回调的通用方法,它会按预期工作。

也与预保存钩子的 done 参数一起工作,没有任何不同的结果

我在这里想念什么

我的代码如下所示:

var mongoose = require('mongoose');
var should = require('should');

mongoose.connect("localhost","test_db");

var CommentSchema = new mongoose.Schema({
  content:    {type:String},
  created_at: {type:Date, default:Date.now},
  _post:{type:mongoose.Schema.ObjectId,ref:'Post'}

});

var PostSchema = new mongoose.Schema({
  title:    {type:String},
  content:  {type:String},
  comments: [{type:mongoose.Schema.ObjectId, ref:'Comment'}],
  counter: {type:Number}

    });

PostSchema.statics.findAndModify= function(query,sort,doc,options,callback){
  return this.collection.findAndModify(query,sort,doc,options,callback);
 }

PostSchema.statics.test_me = function(clb){
   console.log("test_me");
   clb();
}
CommentSchema.pre('save',function(next,done){
  console.log("enter pre save comment");
  if(this.isNew){
   Post.findAndModify({_id:this._post},[],{$inc:{count:1}},{new:true},function(err,post){
    console.log("enter find-and-modify!");
    console.log(post);
   });
  Post.test_me(function(){
    console.log("callback of test_me");
  });
  console.log("exit pre save comment");

    next();
  }
});

var Post = mongoose.model('Post',PostSchema);
var Comment = mongoose.model('Comment',CommentSchema);

var post = new Post({title:"hello world"});
var comment = new Comment({content:"1st comment",_post:post});
post.comments.push(comment);

  var id = post.id;
  console.log(id);
  post.save(function(err){
    comment.save(function(err){
        Post.find({_id:id })
          .populate('comments')
          .exec(function(err,result){
          console.log("--------------- result -----------------");
          console.log(result);
          });
    });
  });

这是我的命令行的结果:

5049f0d2e21547430a000001
enter pre save comment
test_me
callback of test_me
exit pre save comment
enter find-and-modify!
{ __v: 0,
  _id: 5049f0d2e21547430a000001,
  comments: [ 5049f0d2e21547430a000002 ],
  count: 1,
  title: 'hello world' }
--------------- result -----------------
[ { __v: 0,
    _id: 5049f0d2e21547430a000001,
    count: 1,
    title: 'hello world',
    comments: 
     [ { content: '1st comment',
         _post: 5049f0d2e21547430a000001,
         _id: 5049f0d2e21547430a000002,
         __v: 0,
         created_at: Fri Sep 07 2012 15:04:18 GMT+0200 (CEST) } ] } ]

编辑:我不想知道如何用 test_me 按顺序执行 findAndModify。我想知道为什么 findAndMody 在预保存完成后进入。即使它是嵌入式的,也应该像 test_me 方法所展示的那样工作。所以 test_me 方法应该说明异步方法应该嵌套工作......但 findAndModify 不......就像我的命令行输出显示的那样......它总是在预保存退出后进入 findAndModify 即使我使用 done()打回来...

4

1 回答 1

0

由于我们正在处理异步,它将运行

console.log("enter pre save comment");
if(this.isNew){
  Post.findAndModify({_id:this._post},[],{$inc:{count:1}},{new:true},function(err,post){
    console.log("enter find-and-modify!");
    console.log(post);
  });
  Post.test_me(function(){
    console.log("callback of test_me");
  });
  console.log("exit pre save comment");
  next();
}

一个接一个,而不是等待它执行或响应,然后再继续下一个。由于 Post.findAndModify() 需要更长的时间来执行,所以回调函数中的任何内容都将在回调函数之外的任何内容之后执行。

如果您希望它按顺序执行更多

console.log("enter pre save comment");
if(this.isNew){
  Post.findAndModify({_id:this._post},[],{$inc:{count:1}},{new:true},function(err,post){
    console.log("enter find-and-modify!");
    console.log(post);
    Post.test_me(function(){
      console.log("callback of test_me");
      console.log("exit pre save comment");
      next();
    });
  });     
}
于 2012-09-07T19:41:20.900 回答