2016-04-17 17 views
2

ich einen solchen Code habe in meinem Foxx App:bekommen "ArangoError: bind Parameter 'value1' wurde in der Abfrage (während Parsing) nicht deklariert"

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() 

Es scheint korrekt zu sein, aber aus irgendeinem Grund gibt es mir ein Fehler bind parameter 'value1' was not declared in the query (while parsing).

Ich versuchte es in arangosh ... gleichen Fehler auch dort auszuführen:

arangosh [ilearn]> db._query({ "query" : "\n  FOR d IN FULLTEXT('api_texts', '@value0', '@value1')\n   SORT [email protected] @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 

Bin ich falsch, etwas zu tun? Bitte helfen Sie. Vielen Dank!

PS: Arangodb v2.8.6 auf OS X

Antwort

4

Ihr Fehler ist, dass Sie Anführungszeichen um die bind Werte setzen. Bindewerte dürfen nicht in Anführungszeichen gesetzt werden.

Da Sie Vorlagenzeichenfolgen verwenden, wird den Bindungswerten automatisch ein Name zugewiesen: valueN. Das Template-String-Engine übersetzt Ihre Abfrage in etwa so aus:

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

wir diese besser kontrollieren, indem Sie den Vorlagenprozessor aufrufen, ohne das Ergebnis direkt in db._query() zu setzen:

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 [email protected] @valu...", 
    "bindVars" : { 
    "value0" : "theAttribute", 
    "value1" : "theSearchString", 
    "value2" : "sortByMe", 
    "value3" : undefined, 
    "value4" : 5, 
    "value5" : 10 
    } 
} 

Da binden Werte müssen nicht sein In Zeichenfolgen (andernfalls werden sie als Zeichenfolgen behandelt) verweist Ihre Abfrage nicht auf @value0 und @value1, worum es sich bei dem Fehler handelt:

Ein Bindungswert, der in der Liste der Bindungswerte angegeben ist Benutzer, auf die die Abfrage nicht verweist.

Corrected Code ohne Anführungszeichen ${...}:

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() 
+0

Sie sind absolut richtig! Es klappt! Vielen Dank!!! – artnikpro

+0

Ich habe auch diese Art der Überprüfung von 'aqlQuery' in die Dokumentation hinzugefügt. – dothebart