You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MarkLogic中xdmp.spawn传参报错排查及用法示例咨询

问题分析与解决方案

你遇到的ReferenceError: abc is not defined本质是两个问题导致的:

  1. 参数传递的语法错误:你写的(xs.QName("abc"), "foo").Object不是构造参数对象的正确方式,JavaScript里逗号运算符会返回最后一个值,相当于你只传了字符串"foo",而非包含abc键的对象。
  2. 上下文隔离问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:54:12