与NodeJS和Neo4jasynchronous行为的问题

我是一个自学的新手程序员,使用Angular.js,Node.js和graphics数据库neo4j。 现在我试图得到一个非常基本的查询来执行并返回数据到客户端。 执行后,我得到一个closures服务器的错误。

接收到获取请求后执行以下function:

exports.test = function (req, res) { var neo4j = require('neo4j'); var db = new neo4j.GraphDatabase('http://localhost:7474'); var query = [ 'MATCH n', 'RETURN n.name, n, labels(n)' ]; db.query(query, function (err, results) { if (err) {throw err}; var data = results.map(function(result) { return result; }); res.send(data) } )}; 

我在控制台日志中得到以下错误:java.lang.ClassCastException:java.util.ArrayList不能转换为java.lang.String

(我可以提供整个日志,如果它会certificate是有用的)

我将非常感激任何见解。

实际上没有问题。 这就是Node.js的工作原理。 Node.js实际上是一个asynchronous语言,这意味着它将执行下一个语句,而不用等待前面的语句完全执行。 目前,您的代码的工作原理是在与res.send()一起使用之前,将定义variablesdata 。 然而,这种情况并非如此。 实际发生的是这样的:

  1. 您的代码开始映射查询的结果。 variablesdata尚未定义。
  2. 您执行的方法需要data ,但尚不存在。
  3. 你的datavariables在你的results.map()中用callback来定义。

这就是NodeJSasynchronous行为的工作原理。 基本上,callback(方法内的函数)执行LAST。 因此,你可能想把res.send()语句放在你的callback函数中,就像这样(注意定义datavariables首先是无用的,因为它取决于callback函数的值):

 results.map(function(result) { res.send(result); }); 

缠绕你的头是一个艰难的概念…花了我大约一个星期。 如果您还有其他问题,请告诉我。

你错误的原因是你传递一个数组作为查询:

 var query = [ 'MATCH n', 'RETURN n.name, n, labels(n)' ]; db.query(query, function (err, results) { ... } 

这应该是一个string,因此java.lang.ClassCastException

所以你应该joinquery数组来使它成为一个string,或者不要使用数组:

 // solution 1 var query = [ 'MATCH n', 'RETURN n.name, n, labels(n)' ].join(' '); // solution 2 var query = 'MATCH n RETURN n.name, labels(n)'; 

而且,这个代码有点多余:

 var data = results.map(function(result) { return result; }); res.send(data); 

为什么不使用这个?

 res.send(results);