У объекта #<Object> нет метода 'http' при использовании neo4j и bluebird

Я использую эту библиотеку Neo4J, и вместо этого я хотел бы использовать обещания. Поэтому я попытался использовать обещание Bluebird. Я создал следующий код...

    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);

Тем не менее, теперь я получаю следующую ошибку, которая фиксируется на ошибке...

Ошибка типа: у объекта # нет метода '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 ответа

Решение

Могу поспорить, это исправит это:

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 предотвратит сбой, если БД не работает. В моем случае я использую XML-файл, чтобы смоделировать данные, когда я не могу добраться до сервера.

Другие вопросы по тегам