在脚本中介 esb wso2 中出现错误 'Cannot read property "length" from undefined'

Getting Error 'Cannot read property "length" from undefined' in script mediator esb wso2

当我使用脚本中介编写将 json 数组转换为 esb wso2 中的 xml 数组的代码时,我收到错误 "Cannot read property "length" from undefined"。请帮忙。 我的脚本中介代码是

<script language="js"><![CDATA[
                  payload = mc.getPayloadJSON();
    results = payload.results;
    var response = <locations/>;
    for (i = 0; i < results.length; ++i) {
        var elem = results[i];
        response.locations += <jacdevice>
            <JACDeviceId>{elem.Id}</JACDeviceId>
            <Make>{elem.ManufacturerName}</Make>
            <Model>{elem.ModelName}</Model>
        </jacdevice>
    }
    mc.setPayloadXML(response);
                ]]></script>

详细错误为

ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} -  The script engine returned an error executing the inlined js script function mediate {org.apache.synapse.mediators.bsf.ScriptMediator}
com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: TypeError: Cannot read property "length" from undefined (<Unknown Source>#4) in <Unknown Source> at line number 4
    at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
    at javax.script.CompiledScript.eval(CompiledScript.java:92)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:333)
    at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:265)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:233)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
    at org.apache.synapse.mediators.eip.splitter.IterateMediator.mediate(IterateMediator.java:256)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:267)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:766)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:282)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:261)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)

好吧,错误几乎可以告诉您出了什么问题。在这一行:

for (i = 0; i < results.length; ++i) {

变量results未定义。

这强烈表明您对 mc.getPayloadJSON() 的调用失败了,或者它以您未预料到的格式返回了结果。尝试从那里进行调试。

尝试 results = payload.Results; 而不是 results = payload.results;

如果不行,试试这个。

var jsonData = JSON.parse(payload)
results = jsonData.Results;