使用neo4j和bluebird

时间:2015-08-04 14:24:01

标签: neo4j bluebird node-neo4j

我正在使用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) {
          ...
        }
      })
}

2 个答案:

答案 0 :(得分:1)

我打赌这会解决它:

Cypher = Promise.promisify(db.cypher.bind(db));

为了将来参考,调试方法是将错误消息解释为this没有http方法,但您知道db会这样做,所以{ {1}}不得设置为this。事实上,通过db会失去db.cypherthis的引用。

答案 1 :(得分:0)

除了答案,我建议添加以下内容......

if(db.cypher)
  Promise.promisify(db.cypher.bind(db));

如果数据库关闭,if将阻止失败。在我的情况下,当我无法访问服务器时,我使用XML文件来模拟数据。