Javascript 回调 returns "undefined" 使用 neo4j 和流星

Javascript callback returns "undefined" using neo4j and meteor

我的学士论文需要使用 javascript 为业务流程构建 Web 前端/可视化。这个过程存储在 neo4j 数据库(版本 2.1.7)中,我正在使用流星和驱动程序,这是在 neo4j 的网站(版本 2.10)上推荐的。

由于我对一般的 Web 开发相当陌生,尤其是 javascript,我不确定我的问题是技术性的还是知识性的(也就是我是初学者)。

目前我正在处理一个函数,它应该从数据库中返回一个节点(目前 "a node" 等于节点的 id,因为网页上节点的最终表示还没有决定)。

getNodeById = function getNodeById(id){
    console.log("The given id is " + id);  
    var result = undefined;

    N4JDB.getNodeById(id, function getNode(node) {

      console.log ("The node's id is " + node.id);
      console.log("Result before " + result );
      result = node.id;
      console.log("Result after " +result);

    });
return result;

} 

调用 getNodeById(4) 在 meteor 的控制台上给我以下输出:

I20150309-16:03:32.200(1)?给定的 id 是 4 I20150309-16:03:32.272(1)?节点的 id 未定义 I20150309-16:03:32.272(1)?未定义前的结果 I20150309-16:03:32.272(1)? undefined

后的结果

现在的问题是,我不确定如何编写适合驱动程序 getNodeById 函数的回调函数。

Link 到驱动程序文档:https://atmospherejs.com/ostrio/neo4jdriver

编辑:进一步的调试让我相信,我在调用 N4JDB.getNodeById 时犯了一个错误 somewhere/how 因为它总是 returns null

新函数(需要在文件顶部声明,因为会有很多函数与此类似)看起来像这样

getNodeById = function getNodeById(id){
  var myFuture = new Future ();
  var result = undefined;
  N4JDB.getNodeById(id, function getNode(node){
      console.log(node);
      result = node.id;
      myFuture.return(result);
    });
  return myFuture.wait();
}

最终编辑:它适用于

   getNodeById = function getNodeById(id){
      var myFuture = new Future ();
      var result = undefined;
      N4JDB.getNodeById(id, function getNode(err,node){
          //console.log(node);
          result = node.id;
          myFuture.return(result);
        });
      return myFuture.wait();

}

Meteor 基于 node.js,因此它是异步工​​作的。 您的代码开始执行函数,但不等待结果。

一个好的解决方案可以使用 fibers/future npm 包,如 link 中所述。 https://www.discovermeteor.com/patterns/5828399

所以:

getNodeById = function getNodeById(id){
    Future = Npm.require('fibers/future');
    var myFuture = new Future();
    var result = undefined;

    N4JDB.getNodeById(id, function getNode(node) {
        result = node.id;
        myFuture.return(result);
    });

    return myFuture.wait();

} 

希望对您有所帮助

如果您使用的是 Meteor 的 Neo4jDriver,您可以简单地 运行 并执行 Cypher 查询。

var foundByID = new ReactiveVar(null);
N4JDB.query('MATCH (s) WHERE id(s) = {myNodeID} RETURN s;', {myNodeID: 123}, function(error, result){
   if(error){
       //Throw error here
       throw new Meteor.Error(500, error);
   }
   foundByID.set(result);
});

或使用Neo4jReactivity