DHF 6.0.0中SJS向XQuery传递参数失败问题排查
这种情况大概率是代码调用时的上下文或语法细节问题,而非DHF 6.0.0的原生Bug——毕竟相同逻辑在QConsole能正常运行。以下是具体排查方向:
检查SJS调用XQuery的语法是否符合DHF运行时要求
在SJS中调用XQuery模块,要避免依赖全局变量的传递方式,优先通过函数参数明确传值。比如:
错误写法(依赖全局变量绑定):xqueryEval("import module namespace log = 'http://example.com/log'; log:log($myVar)", {myVar: "test"});正确写法(通过模块函数参数传递):
const log = require("/ext/log.xqy"); log.log("test");DHF Step的运行上下文对全局变量的作用域有严格限制,直接用
xqueryEval绑定全局变量可能无法被XQuery模块识别。验证DHF Step的运行上下文变量范围
DHF Step的运行环境和QConsole完全不同:QConsole是用户会话上下文,而Step是在模块数据库的隔离上下文运行。要确认你传递的变量是否属于Step的可用范围——比如是否是Step内置的$content、$options变量,还是自定义变量。自定义变量必须在SJS中显式定义并通过函数参数传递,不能依赖隐式上下文。检查XQuery模块的导入路径和命名空间
DHF部署后,模块会被放到特定的数据库路径下(如/data-hub/或自定义的/ext/目录)。要确保SJS中require的路径和部署后的实际路径一致,比如本地开发时的src/main/ml-modules/ext/log.xqy,部署后路径是/ext/log.xqy,路径错误会导致模块加载失败,间接引发变量未定义的报错。确认模块部署完整性
登录QConsole查看模块数据库(通常为data-hub-MODULES),检查log.xqy是否存在且内容正确。如果部署过程中模块遗漏或内容异常,会导致调用时函数无法识别、变量绑定失败。测试最小化验证案例
编写极简测试代码:创建一个只接收单个字符串参数的XQuery函数,在SJS中调用它并传值。如果极简案例能正常运行,说明原代码的复杂逻辑或变量传递方式存在问题;如果极简案例也报错,可尝试升级到DHF 6.x的后续小版本(如6.0.1)验证是否为版本特定Bug。
内容的提问来源于stack exchange,提问作者XCELERENT - I want to dance

