ArangoDB - 查询在FOXX中不起作用,但在Web界面中起作用

时间:2015-08-02 15:34:40

标签: javascript arangodb foxx

此查询:

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   文件/ ArangoDB   2.6.2的/ var / lib中/ arangodb-应用/ _db / _SYSTEM / exameFacil / APP /控制器/ clinics.js]   at [object Object] .Module.run(C:\ Program Files \ ArangoDB   在ArangoApp.loadAppScript(c:/ Program Files / ArangoDB)2.6.2 \ bin ../ share / arangodb / js / common / bootstrap / modules.js:1420:20)   2.6.2 /共享/ arangodb / JS /服务器/模块/组织/ arangodb /福克斯/ arangoApp.js:452:24)   在mountController(c:/ Program Files / ArangoDB   2.6.2 /共享/ arangodb / JS /服务器/模块/组织/ arangodb /福克斯/ routing.js:661:7)   在c:/ Program Files / ArangoDB   2.6.2 /共享/ arangodb / JS /服务器/模块/组织/ arangodb /福克斯/ routing.js:630:9   位于routeApp的Array.forEach(native)(c:/ Program Files / ArangoDB   2.6.2 /共享/ arangodb / JS /服务器/模块/组织/ arangodb /福克斯/ routing.js:629:32)   在Object.routes(c:/ Program Files / ArangoDB   2.6.2 /共享/ arangodb / JS /服务器/模块/组织/ arangodb /福克斯/ manager.js:268:10)   在foxxRouting(c:/ Program Files / ArangoDB   2.6.2 /共享/ arangodb / JS /服务器/模块/组织/ arangodb / actions.js:1054:74)   在执行时(c:/ Program Files / ArangoDB   2.6.2 / share / arangodb / js / server / modules / org / arangodb / actions.js:1308:7)在Object.routeRequest(c:/ Program Files / ArangoDB)   在Function.actions.defineHttp.callback(c:\ Program Files \ ArangoDB)2.6.2 / share / arangodb / js / server / modules / org / arangodb / actions.js:1329:3)   2.6.2 \共享\ arangodb \ JS \动作\ API-system.js:58:15)

有什么建议吗?感谢

1 个答案:

答案 0 :(得分:2)

错误的原因是示例代码中的JavaScript解析错误。 JavaScript不支持函数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}`
}),

另一种方法是将查询字符串放在一行上。 用于上述查询的替代方案是可读性和样式偏好的问题。

在处理用户生成的输入时,我建议使用绑定参数将用户输入与实际查询字符串分开,并防止注入。