1

我是一名自学成才的新手程序员,正在开发一个使用 Angular.js、Node.js 和图形数据库 neo4j 的简单 Web 应用程序。现在我正在尝试获取一个非常基本的查询来执行并将数据返回给客户端。执行后,我收到一个关闭服务器的错误。

收到 get 请求后执行以下函数:

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 cannot be cast to java.lang.String

(如果证明有用,我可以提供整个日志)

我将非常感谢任何见解。

4

2 回答 2

2

您的错误的原因是您将数组作为查询传递:

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

那应该是一个字符串,因此java.lang.ClassCastException.

因此,您应该加入query数组以使其成为字符串,或者不使用数组:

// 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);
于 2013-07-11T05:03:20.783 回答
1

实际上没有问题。这就是 Node.js 的工作方式。Node.js 实际上是一种异步语言,这意味着它将执行下一条语句,而无需等待前一条语句完全执行。目前,您的代码假设变量data将在与res.send(). 然而,这种情况并非如此。实际发生的是这样的:

  1. 您的代码开始映射查询的结果。该变量data尚未定义。
  2. 您执行了一个 requires 的方法data,该方法尚不存在。
  3. 您的data变量是使用results.map().

这就是 NodeJS 的异步行为的工作原理。基本上,回调(方法中的函数)最后执行。因此,您可能希望将res.send()语句放在回调中,就像这样(请注意,首先定义data变量是无用的,因为它的值依赖于回调):

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

这是一个很难理解的概念……花了我大约一周的时间。如果您还有其他问题,请告诉我。

于 2013-07-07T04:27:06.187 回答