0

このクエリ:

FOR clinic IN exameFacil_clinics
                    LET procedures_list = (
                    FOR procedure IN clinic.procedures
                    FILTER LIKE(procedure.name, "%hemo%", true)
                    COLLECT procedures_list = procedure.name
                    RETURN procedures_list
                )
                FILTER LENGTH(procedures_list) > 0
                RETURN{
                        clinic_name: clinic.name,
                        procedures_list: procedures_list}

AQLエディターでArangoDBのWebインターフェイスで実行すると正常に動作し、期待される結果を返しますが、FOXXリポジトリで実行しようとするとエラーが発生します。

'use strict';
var Foxx = require('org/arangodb/foxx');

module.exports = Foxx.Repository.extend({
  // Add your custom methods here

  //Return all procedures from a clinic, given the clinic id
  getAllProcedures: Foxx.createQuery({
        query: 'FOR clinic IN exameFacil_clinics FILTER clinic._key == @id RETURN clinic.procedures',
        params: ['id']

    }),

  //Make a 'LIKE' query in all procedures from all clinics, given the search string ( procedure name )
  searchProcedure: Foxx.createQuery({
        query: 'FOR clinic IN exameFacil_clinics
                    LET procedures_list = (
                    FOR procedure IN clinic.procedures
                    FILTER LIKE(procedure.name, "%hemo%", true)
                    COLLECT procedures_list = procedure.name
                    RETURN procedures_list
                )
                FILTER LENGTH(procedures_list) > 0
                RETURN{
                        clinic_name: clinic.name,
                        procedures_list: procedures_list}'

    }),

});

エラー:

[ArangoError 3103: モジュール ファイルの呼び出しに失敗しました: c:/Program Files/ArangoDB 2.6.2/var/lib/arangodb-apps/_db/_system/exameFacil/APP/controllers/clinics.js] [object Object].Module ArangoApp.loadAppScript (c:/Program Files/ArangoDB 2.6. 2/share/arangodb/js/server/modules/org/arangodb/foxx/arangoApp.js:452:24) マウントコントローラー (c:/Program Files/ArangoDB 2.6.2/share/arangodb/js/server/modules/) org/arangodb/foxx/routing.js:661:7) c:/Program Files/ArangoDB 2.6.2/share/arangodb/js/server/modules/org/arangodb/foxx/routing.js:630:9 でObject.routes (c :/Program Files/ArangoDB 2.6.2/share/arangodb/js/server/modules/org/arangodb/foxx/manager.js:268:10) foxxRouting で (c:/Program Files/ArangoDB 2.6.2/share/arangodb/js/server/modules/ org/arangodb/actions.js:1054:74) at execute (c:/Program Files/ArangoDB 2.6.2/share/arangodb/js/server/modules/org/arangodb/actions.js:1308:7) at Object Function.actions.defineHttp.callback (c:\Program Files \ArangoDB 2.6.2\share\arangodb\js\actions\api-system.js:58:15)Function.actions.defineHttp.callback (c:\Program Files\ ArangoDB 2.6.2\share\arangodb\js\actions\api-system.js:58:15)Function.actions.defineHttp.callback (c:\Program Files\ ArangoDB 2.6.2\share\arangodb\js\actions\api-system.js:58:15)

何かアドバイス?ありがとう

4

1 に答える 1

2

エラーの理由は、コード例の JavaScript 解析エラーです。JavaScript は、 function で使用される複数行の文字列をサポートしていませんsearchProcedure。クエリ文字列が複数行にまたがるようにするには、文字列連結またはテンプレート文字列 (バッククォートで囲まれた文字列、ES6 機能) を使用する必要があります。

文字列連結の例:

searchProcedure: Foxx.createQuery({
  query: 'FOR clinic IN exameFacil_clinics' + 
         '  LET procedures_list = (' +
         // ... string goes on here 
         'procedures_list: procedures_list}'
}),

テンプレート文字列の使用例:

searchProcedure: Foxx.createQuery({
  query: `FOR clinic IN exameFacil_clinics
            LET procedures_list = (
          // ... string goes on here 
          procedures_list: procedures_list}`
}),

もう 1 つの方法は、クエリ文字列を 1 行に入れることです。上記のクエリにどの代替手段を使用するかは、読みやすさとスタイルの好みの問題です。

ユーザーが生成した入力を処理するときは、バインド パラメーターを使用してユーザー入力を実際のクエリ文字列から分離し、インジェクションから保護することもお勧めします。

于 2015-08-04T07:01:08.630 に答える