我正在使用this Neo4J库,我想使用promises代替。所以我尝试使用bluebird的promisify。我创建了以下代码......
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);
但是,现在我收到了以下错误,该错误是在错误...
上捕获的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) {
...
}
})
}
答案 0 :(得分:1)
我打赌这会解决它:
Cypher = Promise.promisify(db.cypher.bind(db));
为了将来参考,调试方法是将错误消息解释为this
没有http
方法,但您知道db
会这样做,所以{ {1}}不得设置为this
。事实上,通过db
会失去db.cypher
对this
的引用。
答案 1 :(得分:0)
除了答案,我建议添加以下内容......
if(db.cypher)
Promise.promisify(db.cypher.bind(db));
如果数据库关闭,if将阻止失败。在我的情况下,当我无法访问服务器时,我使用XML文件来模拟数据。