在Mirth中从CDN读取JS库



我正在围绕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);

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

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

我怎样才能让Mirth使用图书馆?

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('_', _);

注意: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])));

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

附加评论

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

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

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

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

尽管导入第三方库可能是一种选择,但我实际上正在研究这一点,以便我们的团队编写自己的自定义函数,为它们编写单元测试,最后能够在Mirth中提取代码。我在尝试lodash,但使用它并不是我的最终目标。我的解决方案是在全局脚本中用java进行RESTGET调用。你的URL将是你想要提取的代码的GitHub原始URL。与我最初问题的代码相同,但正如我所说,URL是我想要提取的函数的原始GitHub URL。

最新更新