猫鼬中间件问题

时间:2012-09-07 22:46:28

标签: node.js mongodb mongoose

场景如下

场景#1

someSchema.pre('save', function(next){
  asyncFunction(function(){
    this.sub.value = 'something'
    next()
  })
})

这会失败,因为这会更改上下文,现在代表asyncFunction,因此我无法修改函数中的传入数据。它出现了一个错误,即未定义this.sub

场景#2,基于来自hooks-js的信息

some.Schema.pre('save', function(next){
  asyncFunction(function(){
    next('something')
  });
});
some.Schema.pre('save', function(next, value){
  this.sub.value=value
  next()
})

这是有效的,只要它修改了值,并且mongodb方面很好,但它只是挂起,并且在保存文档后永远不会继续。

我做错了吗?有更好的方法吗?或者这是一个错误

情景#3最初失败但现在似乎有效

someSchema.pre('save', function(next){
  x = this
  asyncFunction(function(){
    x.sub.value = 'something'
    next()
  })
})

那就是说,我仍然很好奇为什么情景#2不起作用。

1 个答案:

答案 0 :(得分:2)

在第一个场景中,您需要捕获要为回调提供的原始this上下文,如下所示:

someSchema.pre('save', function(next){
  var self = this;
  asyncFunction(function(){
    self.sub.value = 'something'
    next()
  })
})

在第二种情况下,我认为你在杂草中有点不对劲。您不能通过参数将值从一个中间件函数传递到下一个。当您使用middleware的两个参数回调版本时,您将其标记为并行中间件,第二个参数是在回调完成后必须调用的done函数。