Script Mediator Javascript 在 WSO2 EI ESB 上无法正常工作
Script Mediator Javascript does not work properly on WSO2 EI ESB
下午好,我是 WSO2 ESB 的新手,我正在使用一个 api,其中我们使用一个带有 javascript 的中介脚本,但是我发现该脚本不起作用正确地,基本上是获取值并对其进行一些转换的脚本,但是,在日志级别,我看到该变量仅指示 True 值,就好像它是布尔值
我的API如下:
<filter xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" source="get-property('axis2', 'HTTP_SC')" regex="200">
<then>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="balance" expression="$body/ns3:queryTotalBalanceResponse/ns3:balance/text()"/>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="negativeBalance" expression="$body/ns3:queryTotalBalanceResponse/ns3:negativeBalance/text()"/>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="exponentBalance" expression="$body/ns3:queryTotalBalanceResponse/ns3:balance/@exponent"/>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="exponentNegativeBalance" expression="$body/ns3:queryTotalBalanceResponse/ns3:negativeBalance/@exponent"/>
<property name="balanceLength" expression="fn:string-length(get-property('balance'))"/>
<property name="negativeBalanceLength" expression="fn:string-length(get-property('negativeBalance'))"/>
<script language="js">var exponent = mc.getProperty('exponentBalance'); var balance = mc.getProperty('balance'); if(exponent > 0) { var itera = exponent * -1; var zero = '0'; for (i = 0; i < itera; ++i) { zero = zero.concat('0'); } var result = balance.concat(zero); } mc.setProperty("RESULT", String(result));</script>
<filter xpath="fn:number(get-property('exponentBalance')) > 0">
<then>
<property name="beforeBalance" expression="fn:concat($ctx:balance,'0000000000000000000')"/>
<property name="balanceResponse" expression="fn:substring($ctx:beforeBalance,1,$ctx:balanceLength+$ctx:exponentBalance)"/>
</then>
<else>
<filter xpath="fn:number(get-property('exponentBalance')) = 0">
<then>
<property name="balanceResponse" expression="$ctx:balance"/>
</then>
<else>
<filter xpath="fn:number(get-property('balance')) = 0">
<then>
<property name="beforeBalance" expression="fn:substring($ctx:balance,1,$ctx:balanceLength+$ctx:exponentBalance)"/>
<property name="stringToInsertbalance" value="."/>
<property name="afterBalance" expression="fn:substring($ctx:balance,$ctx:balanceLength+$ctx:exponentBalance+1)"/>
<property name="balanceResponse" expression="fn:concat(0,$ctx:beforeBalance,$ctx:stringToInsertbalance,$ctx:afterBalance)"/>
</then>
<else>
<property name="beforeBalance" expression="fn:substring($ctx:balance,1,$ctx:balanceLength+$ctx:exponentBalance)"/>
<property name="stringToInsertbalance" value="."/>
<property name="afterBalance" expression="fn:substring($ctx:balance,$ctx:balanceLength+$ctx:exponentBalance+1)"/>
<property name="balanceResponse" expression="fn:concat($ctx:beforeBalance,$ctx:stringToInsertbalance,$ctx:afterBalance)"/>
</else>
</filter>
</else>
</filter>
</else>
</filter>
<log>
<property name="balance" expression="$ctx:balance"/>
<property name="balanceLength" expression="$ctx:balanceLength"/>
<property name="negativeBalanceLength" expression="$ctx:negativeBalanceLength"/>
<property name="exponentBalance" expression="$ctx:exponentBalance"/>
<property name="exponentNegativeBalance" expression="$ctx:exponentNegativeBalance"/>
<property name="beforeBalance" expression="$ctx:beforeBalance"/>
<property name="beforeNegativeBalance" expression="$ctx:beforeNegativeBalance"/>
<property name="stringToInsertbalance" expression="$ctx:stringToInsertbalance"/>
<property name="stringToInsertNegativeBalance" expression="$ctx:stringToInsertNegativeBalance"/>
<property name="afterBalance" expression="$ctx:afterBalance"/>
<property name="afterBalanceNegative" expression="$ctx:afterBalanceNegative"/>
<property name="balanceResponse" expression="$ctx:balanceResponse"/>
<property name="negativeBalanceResponse" expression="$ctx:negativeBalanceResponse"/>
<property name="result" expression="get-property('result')"/>
<property name="absolute" expression="get-property('absolute')"/>
</log>
我在 javascript 级别使用的脚本如下:
<script language="js">var exponent = mc.getProperty('exponentBalance'); var balance = mc.getProperty('balance'); if(exponent > 0) { var itera = exponent * -1; var zero = '0'; for (i = 0; i < itera; ++i) { zero = zero.concat('0'); } var result = balance.concat(zero); } mc.setProperty("RESULT", String(result));</script>
同样如果我给Result变量加一个固定值,它总是显示True,我用的是WSO2 EI 6.5
可能发生了什么?
更新
更新行以设置如下定义的变量:
<script language="js">var exponent = mc.getProperty('exponentBalance'); var balance = mc.getProperty('balance'); if(exponent > 0) { var itera = exponent * -1; var zero = '0'; for (i = 0; i < itera; ++i) { zero = zero.concat('0'); } var result = balance.concat(zero); } mc.setProperty("result", String(result));</script>
修改了以下行:
mc.setProperty("result", String(result))
但是,我在日志级别得到以下信息:
您可能已将 属性“结果”的值设置为“真”。这是因为您没有在脚本调解器中为 属性“结果”设置任何值。
在脚本介体中,您正在设置 属性 名称“RESULT”的值,而您正在获取 属性 名称 属性 名称“result”的值。
mc.setProperty("RESULT", String(result));
<property name="result" expression="get-property('result')"/>
如果要访问脚本中介中设置的值,需要按如下方式设置值。
mc.setProperty("result", String(result));
根据第一条评论更新
此行为的原因是,您在脚本中介的 if 条件中定义了变量“result”。如果 if 条件没有被执行,“result”将是未定义的。您需要在具有默认值的 if 条件之前定义 var "result"。
下午好,我是 WSO2 ESB 的新手,我正在使用一个 api,其中我们使用一个带有 javascript 的中介脚本,但是我发现该脚本不起作用正确地,基本上是获取值并对其进行一些转换的脚本,但是,在日志级别,我看到该变量仅指示 True 值,就好像它是布尔值
我的API如下:
<filter xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" source="get-property('axis2', 'HTTP_SC')" regex="200">
<then>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="balance" expression="$body/ns3:queryTotalBalanceResponse/ns3:balance/text()"/>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="negativeBalance" expression="$body/ns3:queryTotalBalanceResponse/ns3:negativeBalance/text()"/>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="exponentBalance" expression="$body/ns3:queryTotalBalanceResponse/ns3:balance/@exponent"/>
<property xmlns:ns3="http://www.ericsson.com/OCS/OCS_Provision_types/v1" name="exponentNegativeBalance" expression="$body/ns3:queryTotalBalanceResponse/ns3:negativeBalance/@exponent"/>
<property name="balanceLength" expression="fn:string-length(get-property('balance'))"/>
<property name="negativeBalanceLength" expression="fn:string-length(get-property('negativeBalance'))"/>
<script language="js">var exponent = mc.getProperty('exponentBalance'); var balance = mc.getProperty('balance'); if(exponent > 0) { var itera = exponent * -1; var zero = '0'; for (i = 0; i < itera; ++i) { zero = zero.concat('0'); } var result = balance.concat(zero); } mc.setProperty("RESULT", String(result));</script>
<filter xpath="fn:number(get-property('exponentBalance')) > 0">
<then>
<property name="beforeBalance" expression="fn:concat($ctx:balance,'0000000000000000000')"/>
<property name="balanceResponse" expression="fn:substring($ctx:beforeBalance,1,$ctx:balanceLength+$ctx:exponentBalance)"/>
</then>
<else>
<filter xpath="fn:number(get-property('exponentBalance')) = 0">
<then>
<property name="balanceResponse" expression="$ctx:balance"/>
</then>
<else>
<filter xpath="fn:number(get-property('balance')) = 0">
<then>
<property name="beforeBalance" expression="fn:substring($ctx:balance,1,$ctx:balanceLength+$ctx:exponentBalance)"/>
<property name="stringToInsertbalance" value="."/>
<property name="afterBalance" expression="fn:substring($ctx:balance,$ctx:balanceLength+$ctx:exponentBalance+1)"/>
<property name="balanceResponse" expression="fn:concat(0,$ctx:beforeBalance,$ctx:stringToInsertbalance,$ctx:afterBalance)"/>
</then>
<else>
<property name="beforeBalance" expression="fn:substring($ctx:balance,1,$ctx:balanceLength+$ctx:exponentBalance)"/>
<property name="stringToInsertbalance" value="."/>
<property name="afterBalance" expression="fn:substring($ctx:balance,$ctx:balanceLength+$ctx:exponentBalance+1)"/>
<property name="balanceResponse" expression="fn:concat($ctx:beforeBalance,$ctx:stringToInsertbalance,$ctx:afterBalance)"/>
</else>
</filter>
</else>
</filter>
</else>
</filter>
<log>
<property name="balance" expression="$ctx:balance"/>
<property name="balanceLength" expression="$ctx:balanceLength"/>
<property name="negativeBalanceLength" expression="$ctx:negativeBalanceLength"/>
<property name="exponentBalance" expression="$ctx:exponentBalance"/>
<property name="exponentNegativeBalance" expression="$ctx:exponentNegativeBalance"/>
<property name="beforeBalance" expression="$ctx:beforeBalance"/>
<property name="beforeNegativeBalance" expression="$ctx:beforeNegativeBalance"/>
<property name="stringToInsertbalance" expression="$ctx:stringToInsertbalance"/>
<property name="stringToInsertNegativeBalance" expression="$ctx:stringToInsertNegativeBalance"/>
<property name="afterBalance" expression="$ctx:afterBalance"/>
<property name="afterBalanceNegative" expression="$ctx:afterBalanceNegative"/>
<property name="balanceResponse" expression="$ctx:balanceResponse"/>
<property name="negativeBalanceResponse" expression="$ctx:negativeBalanceResponse"/>
<property name="result" expression="get-property('result')"/>
<property name="absolute" expression="get-property('absolute')"/>
</log>
我在 javascript 级别使用的脚本如下:
<script language="js">var exponent = mc.getProperty('exponentBalance'); var balance = mc.getProperty('balance'); if(exponent > 0) { var itera = exponent * -1; var zero = '0'; for (i = 0; i < itera; ++i) { zero = zero.concat('0'); } var result = balance.concat(zero); } mc.setProperty("RESULT", String(result));</script>
同样如果我给Result变量加一个固定值,它总是显示True,我用的是WSO2 EI 6.5
可能发生了什么?
更新
更新行以设置如下定义的变量:
<script language="js">var exponent = mc.getProperty('exponentBalance'); var balance = mc.getProperty('balance'); if(exponent > 0) { var itera = exponent * -1; var zero = '0'; for (i = 0; i < itera; ++i) { zero = zero.concat('0'); } var result = balance.concat(zero); } mc.setProperty("result", String(result));</script>
修改了以下行:
mc.setProperty("result", String(result))
但是,我在日志级别得到以下信息:
您可能已将 属性“结果”的值设置为“真”。这是因为您没有在脚本调解器中为 属性“结果”设置任何值。
在脚本介体中,您正在设置 属性 名称“RESULT”的值,而您正在获取 属性 名称 属性 名称“result”的值。
mc.setProperty("RESULT", String(result));
<property name="result" expression="get-property('result')"/>
如果要访问脚本中介中设置的值,需要按如下方式设置值。
mc.setProperty("result", String(result));
根据第一条评论更新
此行为的原因是,您在脚本中介的 if 条件中定义了变量“result”。如果 if 条件没有被执行,“result”将是未定义的。您需要在具有默认值的 if 条件之前定义 var "result"。