【问题标题】:mongoose middleware issues猫鼬中间件问题
【发布时间】:2012-09-08 07:01:53
【问题描述】:

场景如下

场景#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 不起作用。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    在第一种情况下,您需要捕获原始的 this 上下文,以便像这样对回调可用:

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

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

    【讨论】:

    • 也试过了,一开始没用。出于某种奇怪的原因,它现在可以工作了。
    • 场景#2 基于github.com/bnoguchi/hooks-js,这是中间件所基于的,他们确实提到可以传递变量。事实上,它似乎确实传递了变量,但是它在执行后并没有继续。仍然对此感到好奇。
    猜你喜欢
    • 2018-03-04
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多