我正在使用这个Neo4J库,我想使用承诺代替。所以我尝试使用蓝鸟的承诺。我创建了以下代码…
var db = new neo4j.GraphDatabase('....'),
Promise = require('bluebird'),
Cypher = Promise.promisify(db.cypher);
var query = [
'MATCH (node)',
'OPTIONAL MATCH (node)-[rel]->( )',
'RETURN DISTINCT node as node, collect(rel) as links'
].join('n');
var i = 0
var onSuccess = function (results) {
res.json(parseGraphResponse(results));
},
onFail = function (err) {
console.log("Error " + err);
};
Cypher({
query: query
}).then(onSuccess).catch(onFail);
然而,现在我得到以下捕获的错误onError…
TypeError: object#没有方法'http'
这个版本可以正常工作…
db.cypher({
query: query
}, function (err, results) {
if (err) {
console.log("Error " + err);
return;
}
res.json(parseGraphResponse(results));
});
稍微调查一下就会发现它在这段代码上爆炸了…
GraphDatabase.prototype.cypher = function(opts, cb, _tx) {
...
// Blows up here....
return this.http({
method: method,
path: path,
headers: headers,
body: body,
raw: true
}, (function(_this) {
return function(err, resp) {
...
}
})
}
我打赌这将解决这个问题:
Cypher = Promise.promisify(db.cypher.bind(db));
为将来参考,调试的方法是将错误消息解释为说this
没有http
方法,但您知道db
有,因此this
不能设置为db
。事实上,传递db.cypher
会丢失this
对db
的引用。
除了答案之外,我建议添加以下内容…
if(db.cypher)
Promise.promisify(db.cypher.bind(db));
if将在DB关闭时防止故障。在我的例子中,当我无法访问服务器时,我使用XML文件来模拟数据。