我正在围绕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/[email protected]/,则只需执行var _ = require('fp');
,它就会一步加载所有内容。
var _ = $gc('_');
logger.info(JSON.stringify(_.chunk(2)([1,2,3,4])));
注意:这是使用fp/chunk
的正确方法。在您的OP中,您正在使用标准的chunk
语法进行调用。
我认为这样做是可以的,您可以在部署时一次下载该库并将其存储在globalChannelMap中,然后在需要时从地图中检索它。如果您想在其他地方调用require
对象本身,也可能会在地图中存储它。它将缓存并重用为将来调用同一资源而创建的对象。
我会不是在部署脚本之外的任何地方创建新的Require对象,否则您将在每条消息(或在Javascript Reader
的情况下,每次轮询)上重新下载资源。
使用Vibin所建议的代码模板的好处是,它们可以在部署时直接编译到您的通道中,并且在运行时没有其他提取步骤。使库可用就像将其分配给您的频道一样简单。