【问题标题】:Issues with asynchronous behavior with NodeJS and Neo4jNodeJS 和 Neo4j 的异步行为问题
【发布时间】:2013-07-04 17:55:58
【问题描述】:

我是一名自学成才的新手程序员,正在开发一个使用 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

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

我将非常感谢任何见解。

【问题讨论】:

    标签: javascript node.js neo4j asynchronous


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢 Bagavatu,这非常有用。
    • @Bagavatu map() 并不适合这个,你应该使用 forEach() 代替。而res.send() 也不合适,因为一旦调用它就会结束请求(在这种情况下,在第一个结果之后)。
    • @robertklep 感谢您的提醒。我只是使用了 OP 正在使用的任何功能。
    • @Bagavatu 使用res.send() 没有错,但你不应该在循环中使用它:)
    • @robertklep 哈哈是的。我会亲自将所有结果保存在一个数组中,并在最后一次迭代时发送该数组。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多