RxJS5 Mongo 问题
RxJS5 Mongo issue
我有一些 RxJS 代码使用 mongo 来执行查询。在 RxJS v4 中工作正常,但当我迁移到 v.5 时,我 运行 遇到了问题。
这是一些简化的代码:
// Get a mongo connection
getDb() {
var connect = Rx.Observable.bindNodeCallback(mongodb.connect)
return connect(this.options.connection.uri, this.options.connection.options)
}
// Query
return getDb()
.flatMap((db) => {
var c = db.collection('foo')
var obs = Rx.Observable.bindNodeCallback(c.insertMany, c)
return obs(docs)
})
.subscribe(...)
每次我尝试某种查询时,它都会因各种错误而失败。所有错误都与 Mongo 代码中不存在的 options
对象有关。我认为这可能是上下文问题,但我不确定。
上面的查询产生(在代码中,undefined 是一个 mongo 集合选项对象)
Uncaught TypeError: Cannot read property 'serializeFunctions' of undefined
at BoundNodeCallbackObservable.Collection.insertMany[as callbackFunc](node_modules / mongodb / lib / collection.js: 482: 74)
类似的查询结果:
TypeError: Cannot read property 'options' of undefined
at BoundNodeCallbackObservable.Collection.remove[as callbackFunc](node_modules / mongodb / lib / collection.js: 1223: 12)
更新 当我手动包装它时,一切正常:
var obs = Rx.Observable.create(function(observer) {
c.insertMany(docs, function(err, res) {
if (err) { observer.error(err) } else {
observer.next(res);
observer.complet();
}
})
})
return obs
// This doesn't:
var obs = Rx.Observable.bindNodeCallback(c.insertMany, c)
return obs(docs)
好的。结果 bindNodeCallback
和 bindCallback
不允许传递上下文。所以我们需要这样做:
c.insertMany = c.insertMany.bind(c)
var obs = Rx.Observable.bindNodeCallback(c.insertMany)
我有一些 RxJS 代码使用 mongo 来执行查询。在 RxJS v4 中工作正常,但当我迁移到 v.5 时,我 运行 遇到了问题。
这是一些简化的代码:
// Get a mongo connection
getDb() {
var connect = Rx.Observable.bindNodeCallback(mongodb.connect)
return connect(this.options.connection.uri, this.options.connection.options)
}
// Query
return getDb()
.flatMap((db) => {
var c = db.collection('foo')
var obs = Rx.Observable.bindNodeCallback(c.insertMany, c)
return obs(docs)
})
.subscribe(...)
每次我尝试某种查询时,它都会因各种错误而失败。所有错误都与 Mongo 代码中不存在的 options
对象有关。我认为这可能是上下文问题,但我不确定。
上面的查询产生(在代码中,undefined 是一个 mongo 集合选项对象)
Uncaught TypeError: Cannot read property 'serializeFunctions' of undefined
at BoundNodeCallbackObservable.Collection.insertMany[as callbackFunc](node_modules / mongodb / lib / collection.js: 482: 74)
类似的查询结果:
TypeError: Cannot read property 'options' of undefined
at BoundNodeCallbackObservable.Collection.remove[as callbackFunc](node_modules / mongodb / lib / collection.js: 1223: 12)
更新 当我手动包装它时,一切正常:
var obs = Rx.Observable.create(function(observer) {
c.insertMany(docs, function(err, res) {
if (err) { observer.error(err) } else {
observer.next(res);
observer.complet();
}
})
})
return obs
// This doesn't:
var obs = Rx.Observable.bindNodeCallback(c.insertMany, c)
return obs(docs)
好的。结果 bindNodeCallback
和 bindCallback
不允许传递上下文。所以我们需要这样做:
c.insertMany = c.insertMany.bind(c)
var obs = Rx.Observable.bindNodeCallback(c.insertMany)