【问题标题】:aql.literal is not a fucntion in arangoDB Foxxsql.literal 不是 arangoDB Foxx 中的函数
【发布时间】:2018-11-21 17:03:36
【问题描述】:

我有如下 Foxx 路线

 const aql = require('@arangodb').aql;

    route.get('ABC'){function(req,res){
    //Do some stuffs
    var AnArray1=req.queryParams.AnArray1||[DefaulArray]
    var AnArray2=req.queryParams.AnArray2||[DefaulArray]

    //Turn them into segment to put into AQL
 var segment=aql.literal(AnArray1.length>0 ? 'AND  u.Code IN '+ JSON.stringify(AnArray1)  : '');

    }
    .queryParam('AnArray1', joi.any())
    .queryParam('AnArray2', joi.any())
    .response(['json/application'], 'Done task')

这会返回一个aql.literal is not a function。这对我来说很奇怪,因为我认为它是内置的。arango 的版本是 3.3.5

我哪里做错了?

【问题讨论】:

    标签: javascript arangodb aql foxx


    【解决方案1】:

    v3.3.5 8 个月大(2018-03-28 发布),aql.literal 已添加到 v3.3.9(2018-05-17)中:

    更新到最新的 3.3 版本(目前是 2018-10-04 的 v3.3.17)应该可以解决该问题。

    相对于AnArray1,您使用aql.literal() 的方式看起来不太安全。没有模式验证可以确保它是一个数组 (joi.any()),并且您以后不会测试该类型。字符串实际上会传递req.queryParams.AnArray1||[DefaulArray]AnArray1.length>0,你最终会得到一个像AND u.Code IN "some string" 这样的查询段,它总是false

    不再推荐aql.literal()JSON.stringify 的组合。从 Foxx 中的ArangoJS version 6.7.0 和 ArangoDB v3.4.0-RC.2 开始,支持 AQL 模板字符串的嵌套:

    var coll = db.collection('test')
    var AnArray1 = [ "foo", 2, -0.1, true, null, [ false, { bar: true } ] ]
    
    var segment = (
      Array.isArray(AnArray1) && AnArray1.length > 0
      ? aql`AND u.Code IN ${AnArray1}`
      : undefined
    )
    var fullQuery = aql`FOR u IN ${coll} FILTER u.attr == true ${segment} RETURN u`
    

    这导致fullQuery 成为:

    {
       query: 'FOR u IN @@value0 FILTER u.attr == true AND u.Code IN @value1 RETURN u',
       bindVars: {
         '@value0': 'test',
         value1: [ 'foo', 2, -0.1, true, null, [false, { bar: true } ] ]
       }
    }
    

    使用var AnArray1 = "foo" 你会得到这个:

    {
      query: 'FOR u IN @@value0 FILTER u.attr == true  RETURN u',
      bindVars: { '@value0': 'test' }
    }
    

    只要你想AND 结合FILTER 标准,我的建议就是使用

    aql`FILTER u.Code IN ${AnArray1}`
    

    因为您可以单独使用此段作为过滤器,而 AND ... 在完整查询 (FILTER AND ...) 中可能无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多