2017-08-10 42 views
1

请有人确认以下内容.. 我正在使用欢乐连接3.5.08232。 我的源连接器是数据库读取器。欢乐连接数据库读取器自动列映射

说,我正在使用一个返回多行的查询,并返回结果(通过JavaScript),如文档所示,以便Mirth将每行视为一个单独的消息。我还使用了几个映射器作为源变换器,并将映射的字段保存在我的频道映射中(最终只包含我在变换器中定义的那些字段)

在目标中,特别是在目标响应变换器(或目的主体,如果它是一个JavaScript编写器),我如何访问源字段?

我通过反复试验发现,唯一的办法就是

var rawMsg = connectorMessage.getRawData(); 
var xmlMsg = new XML(rawMsg); 
logger.info(xmlMsg.some_field); // ignore the root element of rawMsg 

这是做这个正确的方式?我认为可能自动检测到的字段会被放入某种地图中,比如sourceMap--但似乎并非如此,对吧?

谢谢

回答

3

如果您使用的是您的变压器映射步骤提取数据,并把它变成一个可变的地图(如信道映射图),那么你可以使用以下方法来从检索后续的JavaScript环境(包括JavaScript的作家,和你的回应变压器):

var value = channelMap.get('key'); 
var value = $c('key'); 
var value = $('key'); 

看更多信息,User Guide的变量映射部分。

因此,回顾一下,假设您使用数据库读取器选择列“mycolumn”。向通道发送的XML将是这样的:

<result> 
    <mycolumn>value</mycolumn> 
</result> 

然后你可以选择提取该消息的块放入供以后使用特定的变量。变压器允许您轻松拖放样品入站消息的各个部分。 在JavaScript作家Mapper Transformer Step

最后(或任何后续的过滤器,变压器,或响应变压器),只需将值成你想要的领域: JavaScript Writer

和相应的JavaScript代码会自动插入: Inserted Code

最后一个音符,如果你选择的变量很多,并不想为每一个映射单独的步骤,您可以使用JavaScript步骤通过迭代消息和每一列提取到一个单独的地图变量:

for each (child in msg.children()) { 
    channelMap.put(child.localName(), child.toString()); 
} 

或者,您也可以直接从JavaScript的作家中只是引用列:

var msg = new XML(connectorMessage.getEncodedData()); 

var column1 = msg.column1.toString(); 
var column2 = msg.column2.toString(); 
... 
+0

感谢您的回复 - 并为您的很多职位在欢乐支持网站上。在特定的情况下,我宁愿所有的变量都以某种方式自动映射 - 实际上它已经完成 - 只是通过原始输入消息的序列化内部表示来获取它们。 - 我想知道的原因是可能有很多很多变量 - 并且逐个添加它们会非常繁琐。但无论如何 - 如果没有这种方式(或者自动为所有输入字段创建映射的方式,比如说),那么我会很乐意将您的答案标记为答案。 –

+1

如果您有很多人,您当然不必单独创建Mapper步骤。例如,使用JavaScript步骤可以自动映射所有内容。我更新了我的答案,注意到这一点。 –