MarkLogic中xdmp.spawn传参报错排查及用法示例咨询
问题分析与解决方案
你遇到的ReferenceError: abc is not defined本质是两个问题导致的:
- 参数传递的语法错误:你写的
(xs.QName("abc"), "foo").Object不是构造参数对象的正确方式,JavaScript里逗号运算符会返回最后一个值,相当于你只传了字符串"foo",而非包含abc键的对象。 - 上下文隔离问题:
xdmp.spawn启动的模块运行在独立执行上下文里,无法直接访问调用端的变量,必须通过特定API获取传递的参数。
修正后的代码
调用端代码:
var abc = "foo"; // 传递键值对形式的参数对象 xdmp.spawn("/oneplusone.sjs", { abc: abc }, { result: true });
目标模块oneplusone.sjs:
// 通过xdmp.getSpawnedArgs()获取传递的参数 const args = xdmp.getSpawnedArgs(); // 返回传入的abc值 args.abc;
xdmp.spawn 详细使用指南
xdmp.spawn是MarkLogic中用于跨上下文执行模块的API,支持异步/同步执行、参数传递、自定义执行环境等,核心签名如下:
xdmp.spawn(modulePath [, argsObject] [, optionsObject])
核心参数说明
modulePath:目标模块在模块数据库中的路径(比如/modules/processor.sjs)argsObject:要传递给目标模块的参数,必须是普通JavaScript键值对对象optionsObject:执行配置选项,常用字段:result: boolean:默认false(异步执行,不等待结果);设为true则同步等待执行结果返回database: number:指定目标模块运行的数据库(需传入数据库ID,可通过xdmp.database("db-name")获取)transactionMode: string:控制事务模式,可选"query"(只读)或"update"(可写)
关键注意点
- 目标模块必须通过
xdmp.getSpawnedArgs()获取参数,不能直接访问调用端变量(上下文完全隔离) - 当
result: true时,spawn的模块返回值会直接传递给调用端;异步模式下无返回值,适合后台任务
完整使用示例
示例1:同步执行并返回处理结果
调用端代码:
const orderData = { orderId: "ORD-2024-001", items: ["Laptop", "Mouse"], total: 899.99 }; // 同步调用,等待结果 const processedResult = xdmp.spawn( "/modules/order-processor.sjs", orderData, { result: true } ); console.log("订单处理结果:", processedResult);
目标模块/modules/order-processor.sjs:
const args = xdmp.getSpawnedArgs(); // 处理业务逻辑 return { status: "processed", orderId: args.orderId, message: `已处理${args.items.length}件商品,总价${args.total}` };
示例2:异步执行后台任务
调用端代码:
const cleanupParams = { targetDir: "/app/logs", retentionDays: 7 }; // 异步提交清理任务,不等待结果 xdmp.spawn("/modules/log-cleanup.sjs", cleanupParams); console.log("日志清理任务已提交至后台");
目标模块/modules/log-cleanup.sjs:
const args = xdmp.getSpawnedArgs(); // 执行文件清理逻辑(示例) const oldLogs = xdmp.filesList(args.targetDir).filter(file => { const fileAge = Date.now() - xdmp.fileLastModified(file); return fileAge > args.retentionDays * 24 * 60 * 60 * 1000; }); oldLogs.forEach(file => xdmp.filesDelete(file)); // 记录任务日志 xdmp.log(`已清理${oldLogs.length}条过期日志`);
示例3:指定数据库执行模块
调用端代码:
// 获取目标数据库ID const contentDbId = xdmp.database("my-content-db"); // 在指定数据库中执行导出任务 const exportResult = xdmp.spawn( "/modules/data-export.sjs", { format: "json", exportDir: "/exports" }, { result: true, database: contentDbId } );
内容的提问来源于stack exchange,提问作者sharu
相关产品推荐
相关产品推荐

