I have a Foxx route like the following
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')
This throw back an aql.literal is not a function
. This is very strange to me since I thought it is a built-in.The version of arango is 3.3.5
Where did I went wrong?
v3.3.5 is 8 months old (released 2018-03-28),
aql.literal
was added in v3.3.9 (2018-05-17):An update to the latest 3.3 version (currently v3.3.17 from 2018-10-04) should fix the problem.
How you use
aql.literal()
doesn't look very safe in regards toAnArray1
. There is no schema validation that would ensure that it's an array (joi.any()
) and you don't test for the type at any later point. Strings would actually passreq.queryParams.AnArray1||[DefaulArray]
andAnArray1.length>0
, and you would end up with a query segment likeAND u.Code IN "some string"
, which will always be false.The combination of
aql.literal()
andJSON.stringify
is not recommended anymore. Starting with ArangoJS version 6.7.0 and ArangoDB v3.4.0-RC.2 in Foxx, nesting of AQL template strings is supported:This results in
fullQuery
being:With
var AnArray1 = "foo"
you get this instead:As long as you want to
AND
combineFILTER
criteria my suggestion would be to usebecause you can then use this segment as filter on its own, whereas
AND ...
might not be valid in the full query (FILTER AND ...
).