对于mongoose mongodb model.save,Q.nfcall和Q.defer中的UnExpected行为

时间:2014-10-21 08:54:00

标签: node.js mongodb coffeescript mongoose q

我正在努力让我的mongoose模型使用Q promises保存异步。 当我使用Q.nfcall或使用Q.defer()连接时,我看到传递给我的promise的结果对象的行为有所不同

值得注意的是,当使用Q.defer()时,我能够访问结果对象的所有属性,就像使用本机回调函数一样。 但是,使用Q.nfcall时,所有属性都是未定义的。 更令人费解的是,记录两个对象,我可以看到整个json字符串打印出来。

这是代码(在coffeescript中)

Customer = new models.Customer({name: 'John Doe'})
console.log 'Customer.id' + Customer.id

deferred = Q.defer()
Customer.save((error, value) -> 
  deferred.resolve(value)
)

deferred.promise.then((customer) -> 
  console.log 'Deferred::customer.id: ' + customer.id
  console.log 'Deferred::customer.name: ' + customer.name
  console.log 'Deferred::customer: ' + customer)

Q.nfcall(Customer.save.bind(Customer)).then((customer) ->  
  console.log 'Qnfcall::customer.id: ' + customer.id
  console.log 'Qnfcall::customer.name: ' + customer.name
  console.log 'Deferred::customer: ' + customer)

这是输出

Qnfcall::customer.id: undefined
Qnfcall::customer.name: undefined
Qnfcall::customer: { __v: 0, name: 'John Doe', _id: 54461d5523867cc087ef4374 },0
Deferred::customer.id: 54461d5523867cc087ef4374
Deferred::customer.name: John Doe
Deferred::customer: { __v: 0, name: 'John Doe', _id: 54461d5523867cc087ef4374 }

我不知道我在这里做错了什么。任何帮助非常感谢!!

1 个答案:

答案 0 :(得分:0)

Mongoose docs开始,Model#save的回调有三个参数:错误,保存的对象和更新的行数:

  

回调将收到三个参数,错误是发生错误,product是保存的产品,numberAffected是在数据库中找到并更新文档时为1,否则为0。

Q.nfcall检测回调的第三个参数,并使用数组[savedObject, numberAffected]解析承诺,这样就不会丢失numberAffected。见Q docs

  

请注意,如果Node.js样式的API使用多个非错误参数(例如child_process.execFile)回调,则Q会在执行转换时将这些参数作为promise的履行值打包到数组中。

在CoffeeScript中,您可以使用destructuring参数来解压缩此数组:

Q.nfcall(Customer.save.bind(Customer)).then ([customer, rowsAffected]) ->  
  console.log 'Qnfcall::customer.id: ' + customer.id
  console.log 'Qnfcall::customer.name: ' + customer.name
  console.log 'Qnfcall::customer: ' + customer
  console.log 'Qnfcall::rowsAffected: ' + rowsAffected