【问题标题】:Error while calling the Java Script Adapter procedure in MFP V8.0在 MFP V8.0 中调用 Java Script Adapter 过程时出错
【发布时间】:2016-08-03 20:12:38
【问题描述】:

我正在将我的应用程序从 MFP V 7.1 迁移到 MFP V 8.0。我有以下场景,其中我正在构建一个数据对象并使用以下代码将请求从我的客户端发送到 MFP 适配器:

function SearchData(username,name,city){
    this.username = username;
    this.name = name;
    this.city = city;
}


searchData(){
    var searchData = new SearchData(getUserId(),name,city);
    var dataRequest = new WLResourceRequest('/adapters/MyAdapterName/searchEmployer', WLResourceRequest.GET);
    alert('there');
    dataRequest.send(searchData).then(
            function(response){
                console.log('response --> ' + response);
            },
            function(){
                console.log('error response --> ' );
            }
    );
}

以下是用我的 java 脚本适配器编写的代码:

function searchData(searchData){
    try{
        WL.Logger.info("Inside searchData() method.");
        var input = {
                method              : 'post',
                returnedContentType : 'json',
                path                : 'rest/search',
                body                : {
                    contentType : 'application/json;charset=utf-8',
                    content     : JSON.stringify(searchData)
                }

        };
        var response = MFP.Server.invokeHttp(input);
        return response;
    }catch(exception){
        WL.Logger.error("Inside searchData() method :: " + exception.message);
        throw exception;
    }
}

每次调用此方法时,都会调用失败函数。我也尝试使用sendFormParameters 方法发送请求,但它返回打印以下错误:

worklight.js:9342 Uncaught Error: Invalid invocation of method WLResourceRequest.sendFormParameters; Form value must be a simple type.
logAndThrowError @ worklight.js:9342
encodeFormParameters @ worklight.js:9727
WLResourceRequest.sendFormParameters @ 
worklight.js:9685searchEmployer @ VM79:47
onclick @ index.html:1

【问题讨论】:

    标签: ibm-mobilefirst mobilefirst-adapters


    【解决方案1】:

    当您传递的对象包含嵌套对象或函数类型时,就会出现该问题。

    在您的情况下,您有多个具有相同名称的变量/函数searchDataSearchData。我建议您将名称更改为更具描述性。

    我已经尝试了以下,它运行成功

    function SearchData(username,name,city){
        this.username = username;
        this.name = name;
        this.city = city;
    }
    
    
    function search(){
        var data = new SearchData(getUserId(), name, city);
        var request = new WLResourceRequest('/adapters/MyAdapterName/searchEmployer', WLResourceRequest.GET);
        request.send(searchData).then(function(response){
          console.log('response --> ', response);
        }, function(error){
          console.log('error response --> ', error);
        });
    }
    

    如果运行上述代码后仍然有问题,请与您的项目共享链接或添加更多代码 sn-ps。

    UDPATE:

    对于 Javascript 适配器,通过 GET 变量params 接收其参数,params 是一个参数数组。

    所以你需要在客户端更新你的代码如下:

    function search(){
        var data = new SearchData(getUserId(), name, city);
        var request = new WLResourceRequest('/adapters/MyAdapterName/searchEmployer', WLResourceRequest.GET);
        request.setQueryParameter("params", [JSON.stringify(data)]);
        request.send().then(function(response){
          console.log('response --> ', response);
        }, function(error){
          console.log('error response --> ', error);
        });
    }
    

    由于传递给适配器的数据是一个问题,因此您需要更新适配器过程以反映这一点,即删除 JSON.stringify

    function searchData(payload){
        try{
            WL.Logger.info("Inside searchData() method.");
            var input = {
                    method              : 'post',
                    returnedContentType : 'json',
                    path                : 'rest/search',
                    body                : {
                        contentType : 'application/json;charset=utf-8',
                        content     : payload
                    }
    
            };
            var response = MFP.Server.invokeHttp(input);
            return response;
        }catch(exception){
            WL.Logger.error("Inside searchData() method :: " + exception.message);
            throw exception;
        }
    }
    

    【讨论】:

    • 适配器方法现在被调用。但是,我所做的更改是我在 中有 audit="true" ,这导致了一些问题。但是我仍然进行了您建议的更改,一旦调用到达适配器方法,我将函数参数设为“未定义”。知道为什么会这样吗?
    • @Prera​​kTiwari 阅读了答案的更新,我在那里解决了这个问题
    • @Yoel ...它对我有用...我在发布评论之前尝试使用 setQueryParameter 方法,但问题是我在方法参数中传递的数据没有括号([])。这就是为什么它对我不起作用。
    • @Prera​​kTiwari 很高兴我能提供帮助
    • @Prera​​kTiwari for JS 参数通过params 查询参数作为数组传递,这就是您需要方括号的唯一原因。 ibm.com/support/knowledgecenter/SSHS8R_7.1.0/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2015-12-12
    相关资源
    最近更新 更多