在arangoDB Foxx中,aql.literal不是功能

时间:2018-11-21 17:03:36

标签: javascript arangodb aql foxx

我有一条类似下面的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

我哪里出错了?

1 个答案:

答案 0 :(得分:1)

v3.3.5已有8个月的历史(发布于2018-03-28),aql.literal已添加到v3.3.9(2018-05-17):

对最新的3.3版本(当前为2018年10月4日的v3.3.17)进行更新应该可以解决该问题。

aql.literal()的使用方式看起来并不安全。没有架构验证可以确保它是一个数组(AnArray1),并且您以后都不会测试该类型。字符串实际上会传递joi.any()req.queryParams.AnArray1||[DefaulArray],并且您最终会得到一个像AnArray1.length>0这样的查询段,该段始终为 false

不再推荐使用AND u.Code IN "some string"aql.literal()的组合。从ArangoJS version 6.7.0和Foxx中的ArangoDB v3.4.0-RC.2开始,支持AQL模板字符串的嵌套:

JSON.stringify

这导致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 ...中可能无效。