Query Console中模块JS函数两次执行间的超时问题求助
排查MarkLogic Query Console模块间歇性找不到问题的思路
问题场景
模块定义(Modules数据库路径:/test/test.mjs)
// test.mjs export function test(message){ xdmp.log("Received: "+message); return "Received: "+message; }
Query Console测试代码
'use strict'; declareUpdate(); // 本测试用例不需要,但实际代码中需要 import { test } from '/test/test.mjs'; test("Hello");
异常现象
- 首次执行完全正常
- 紧接着再次执行时抛出错误:
[javascript] XDMP-MODNOTFOUND: result: evalScriptOrModule(q) -- Module /test/test.mjs not found - 等待5-6分钟后再次执行,功能恢复正常
排查方向
1. 核对模块缓存配置
MarkLogic会对模块做缓存处理,可能是缓存过期/刷新逻辑导致的间歇性问题:
- 登录Admin界面,进入
Groups > 对应组 > Databases > Modules Database > Caching,查看缓存过期时间是否和出现异常的5-6分钟窗口匹配 - 手动执行
xdmp.clearModuleCache()清除模块缓存,之后立即跑测试代码,看是否能复现问题或者直接恢复正常
2. 测试Query Console会话隔离性
Query Console的会话可能存在临时模块缓存,试试这些操作:
- 新开一个Query Console标签页执行测试代码,看是否还会出现找不到模块的情况
- 直接关闭当前Query Console标签页,重新打开后再执行,观察结果
3. 检查集群节点同步状态(如果是集群环境)
如果你的MarkLogic是集群部署,Modules数据库的节点间同步延迟可能导致这个问题:
- 用
xdmp.databaseStatus()检查所有节点的Modules数据库同步状态,确认数据是否一致 - 查看
ErrorLog.txt日志,找有没有模块同步相关的错误或警告信息
4. 验证模块权限与路径
虽然首次执行正常,但权限或路径可能存在临时异常:
- 执行
xdmp.documentPermissions('/test/test.mjs'),确认当前Query Console用户对该模块有read权限 - 检查模块路径是否有大小写问题(部分环境下MarkLogic路径区分大小写)
5. 切换模块加载方式对比测试
试试不同的模块加载方式,排查是否是ES模块导入的特殊逻辑导致:
- 用
require()替代ES模块的import语法,测试是否还会出现间歇性问题 - 把模块代码直接内联到Query Console中执行,对比和加载外部模块的差异
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

