У объекта #<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-файл, чтобы смоделировать данные, когда я не могу добраться до сервера.