aql.literal 不是 arangoDB Foxx 中的函数
aql.literal is not a fucntion in arangoDB 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
。这对我来说很奇怪,因为我认为它是内置的 in.The 版本的 arango 是 3.3.5
我哪里错了?
v3.3.5 已有 8 个月大(2018-03-28 发布),aql.literal
已添加到 v3.3.9(2018-05-17)中:
- https://github.com/arangodb/arangodb/pull/5219
- https://github.com/arangodb/arangodb/blob/devel/CHANGELOG
更新到最新的 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 ...
)。
我有一个像下面这样的 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
。这对我来说很奇怪,因为我认为它是内置的 in.The 版本的 arango 是 3.3.5
我哪里错了?
v3.3.5 已有 8 个月大(2018-03-28 发布),aql.literal
已添加到 v3.3.9(2018-05-17)中:
- https://github.com/arangodb/arangodb/pull/5219
- https://github.com/arangodb/arangodb/blob/devel/CHANGELOG
更新到最新的 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 ...
)。