在 Mirth 中从 CDN 读取 JS 库

Gil*_*ert 3 cdn mirth

我正在围绕 Mirth-Connect 进行一些测试。我有一个测试通道,其数据类型适用Raw于源和一个目标。目的地目前没有执行任何操作。在源代码中,连接器类型为JavaScript Reader,代码执行以下操作...

var url = new java.net.URL('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.fp.min.js');
var conn = url.openConnection();
conn.setRequestMethod('GET');

if(conn.getResponseCode() === 200) {
    var body = org.apache.commons.io.IOUtils.toString(conn.getInputStream(), 'UTF-8');
    logger.debug('CONTENT: ' + body);
    globalMap.put('_', body);
}

conn.disconnect();

// This code is in source but also tested in destination
logger.debug('FROM GLOBAL: ' + $('_')); // library was found
var arr = [1, 2, 3, 4];
var _ = $('_');
var newArr = _.chunk(arr, 2);
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:TypeError: Cannot find function chunk in object

我想要这样做的原因是通过单元测试构建自定义/内部库,并通过内部/公司 CDN 为它们提供服务,并允许 Mirth 使用它们。

如何让 Mirth 可以使用该库?

age*_*ano 5

Rhino 实际上有 commonjs 支持,但 mirth 默认情况下没有启用它。以下是您在频道中使用它的方法。

通道部署脚本

with (JavaImporter(
    org.mozilla.javascript.Context,
    org.mozilla.javascript.commonjs.module.Require,
    org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider,
    org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider,
    java.net.URI
)) {
var require = new Require(
    Context.getCurrentContext(),
    this,
    new SoftCachingModuleScriptProvider(new UrlModuleSourceProvider([
        // Search path. You can add multiple URIs to this array
        new URI('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/')
    ],null)),
    null,
    null,
    true
);
} // end JavaImporter

var _ = require('lodash.min');
require('lodash.fp.min')(_); // convert lodash to fp

$gc('_', _);
Run Code Online (Sandbox Code Playgroud)

注意:cdnjs lodash fp 包有一些奇怪的地方,它无法正确检测环境并强制进行奇怪的两​​阶段导入。如果您使用https://cdn.jsdelivr.net/npm/lodash@4.17.15/,您只需要这样做var _ = require('fp');,它就会一步加载所有内容。

变压器

var _ = $gc('_');
logger.info(JSON.stringify(_.chunk(2)([1,2,3,4])));
Run Code Online (Sandbox Code Playgroud)

注意:这是正确的使用方法fp/chunk。在您的OP中,您使用标准chunk语法进行调用。

附加评论

我认为这样做可能可以,您在部署时下载一次库并将其存储在 中globalChannelMap,然后在需要的地方从地图中检索它。如果您想在其他地方调用它,也可以将require对象本身存储在地图中。它将缓存并重用为将来调用同一资源而创建的对象。

除了部署脚本之外,我不会任何地方创建新Require对象,否则您将在每条消息(或在 . 的情况下每次轮询Javascript Reader)上重新下载资源。

编辑:我想对于内部网络主机来说,如果Javascript Reader您打算让它在下一次轮询时立即获取更改而不重新部署,这可能是可取的,假设您将就地升级库而不是增加版本

正如Vibin建议的那样,使用代码模板的好处是它们在部署时直接编译到您的通道中,并且在运行时没有额外的获取步骤。使库可用就像将其分配给您的频道一样简单。