2017-02-18 23 views
0

我试图插入查询到neo4j从节点中'arr'描述的查询数组。我知道这个数组传递给函数作为console.log(查询)打印出一个单一的查询,我怀疑它与异步的东西,但我是新来的,所以我很困惑。我得到在浏览器中的错误是“无法读取属性‘后’的未定义”通过request发送查询到neo4j通过array.post

function runCypherQuery(arr,callback) { 
    var query; 

    for(var i = 0; i < arr.length; i++){ 

    query = arr[i]; 
    console.log(query); 

     request.post({ 
      headers:{ 
       "Authorization": "Basic bmVvNGo6cGxleGlz" 
      }, 
        uri: httpUrlForTransaction, 
        json: {statements: [{statement: query}]} 
     },function (err, res, body) { 
      callback(err,res,body);    
     }) 
} 
} 

我试图复制相同的功能,而不循环使用单个查询到app.js,并设法送不问题,像这样

var query = "CREATE (u {id:573116})"; 

request.post({ 

    headers:{ 
    "Authorization": "Basic bmVvNGo6cGxleGlz" 
    }, 
     uri: httpUrlForTransaction, 
     json: {statements: [{statement: query}]} 
    }, 
    function (err, res, body) { 
      console.log(body); 
}) 

任何帮助表示赞赏

回答

0

您没有提供足够的信息,但它看起来像request变量是不确定的,因为它不是runCypherQuery功能的范围之内。在尝试通过它通过改变签名是这样的:

function runCypherQuery(request, arr, callback) 

,然后通过request调用函数时。

您应该知道您的代码将异步地发出请求,因此不能保证执行顺序。如果你不在乎,那么这可能不成问题。但是,如果您在arr中有许多单独的Cypher查询,那么您的代码可能效率非常低,因为不仅要制作每个HTTP请求而且还要为每个查询启动和提交事务都有开销。如果可能和合理的话,尝试合并查询会更好。例如,如果您只是试图创建N个节点,则应该可以在单个查询中执行此操作。

+0

感谢您的回复。该数组正在动态创建,因此在调用此函数之前从另一个函数返回。数组最多有60个,它们执行的顺序无关紧要。我试着像你说的那样传递'请求',但是我仍然得到相同的错误。是否因为'request.post'不应该在函数内部,因为它是一个节点模块?有没有其他方式可以在不使用函数的情况下发布数据? –