对象 #<Object> 在使用 neo4j 和 bluebird 时没有方法'http'



我正在使用这个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会丢失thisdb的引用。

除了答案之外,我建议添加以下内容…

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

if将在DB关闭时防止故障。在我的例子中,当我无法访问服务器时,我使用XML文件来模拟数据。

最新更新