Получение ArangoError: параметр привязки «value1» не был объявлен в запросе (при анализе)

У меня есть такой код в моем приложении Foxx:

db._query(aqlQuery`
  FOR d IN FULLTEXT('api_texts', '${args.attribute}', '${args.search}')
    SORT d.${args.sort_by} ${args.sort}
    LIMIT ${args.skip}, ${args.limit}
    RETURN d
`).toArray()

Вроде правильно но у меня почему-то выдает ошибку bind parameter 'value1' was not declared in the query (while parsing).

Я попытался запустить его в arangosh... и там такая же ошибка:

arangosh [ilearn]> db._query({ "query" : "\n        FOR d IN FULLTEXT('api_texts', '@value0', '@value1')\n          SORT d.@value2 @value3\n          LIMIT @value4, @value5\n          RETURN d\n      ", "bindVars" : { "value0" : "title_en", "value1" : "1", "value2" : "created_at", "value3" : "ASC", "value4" : 0, "value5" : 10 } })
JavaScript exception in file '/usr/local/Cellar/arangodb/2.8.6/share/arangodb/js/client/modules/org/arangodb/arangosh.js' at 106,13: ArangoError 1552: bind parameter 'value1' was not declared in the query (while parsing)
!      throw error;
!            ^
stacktrace: ArangoError: bind parameter 'value1' was not declared in the query (while parsing)
    at Object.exports.checkRequestResult (/usr/local/Cellar/arangodb/2.8.6/share/arangodb/js/client/modules/org/arangodb/arangosh.js:104:21)
    at ArangoStatement.execute (/usr/local/Cellar/arangodb/2.8.6/share/arangodb/js/client/modules/org/arangodb/arango-statement.js:186:12)
    at ArangoDatabase._query (/usr/local/Cellar/arangodb/2.8.6/share/arangodb/js/client/modules/org/arangodb/arango-database.js:814:45)
    at <shell command>:1:4

Я делаю что-то неправильно? Пожалуйста помоги. Спасибо!

PS: Arangodb v2.8.6 для OS X


person artnikpro    schedule 17.04.2016    source источник


Ответы (1)


Ваша ошибка в том, что вы заключаете в кавычки значения привязки. Значения привязки не должны заключаться в кавычки.

Поскольку вы используете строки шаблона, значениям привязки автоматически присваивается имя: valueN. Механизм строки шаблона переводит ваш запрос примерно так:

db._query(`
  FOR d IN FULLTEXT('api_texts', '@value0', '@value1')
    SORT d.@value2 @value3
    LIMIT @value4, @value5
    RETURN d
`, {value0: args.attribute, value1.... }).toArray()

Мы лучше проверим это, вызвав обработчик шаблонов, не помещая результат непосредственно в db._query():

args={
    attribute: "theAttribute", 
    search: "theSearchString", 
    sort_by: "sortByMe", 
    skip: 5, 
    limit: 10
}
aqlQuery`FOR d IN FULLTEXT('api_texts', '${args.attribute}', '${args.search}')
    SORT d.${args.sort_by} ${args.sort} LIMIT ${args.skip}, ${args.limit} RETURN d`
{ 
  "query" : "FOR d IN FULLTEXT('api_texts', '@value0', '@value1') 
             SORT d.@value2 @valu...", 
  "bindVars" : { 
    "value0" : "theAttribute", 
    "value1" : "theSearchString", 
    "value2" : "sortByMe", 
    "value3" : undefined, 
    "value4" : 5, 
    "value5" : 10 
  } 
}

Поскольку значения привязки не должны быть в строках (иначе они обрабатываются как строки), ваш запрос не будет ссылаться на @value0 и @value1, о чем и возникает ошибка:

значение привязки, указанное в списке значений привязки, на которое не ссылается запрос.

Исправлен код без кавычек вокруг ${...}:

db._query(aqlQuery`
  FOR d IN FULLTEXT('api_texts', ${args.attribute}, ${args.search})
    SORT d.${args.sort_by} ${args.sort}
    LIMIT ${args.skip}, ${args.limit}
    RETURN d
`).toArray()
person dothebart    schedule 18.04.2016
comment
Я также добавил этот способ проверки aqlQuery в документацию. - person dothebart; 18.04.2016