【问题标题】:How to return value from SOAP function to meteor method?如何将值从 SOAP 函数返回到流星方法?
【发布时间】:2017-02-15 05:12:38
【问题描述】:

我有一个内部调用soap函数的Meteor方法。

Meteor 在收到来自soap 客户端的响应之前正在执行所有语句。

所以我得到一个未定义的结果。

我想在执行方法中的其他语句之前承诺soap执行。

createSoapConnection(){
    var Soap = require('soap');
    var url = 'https://xxxxxx/index.php/api/v2_soap/?wsdl';
    var args = {username: 'xxxxxx', apiKey: 'xxxxxx'};
        let client = Soap.createClient(url, function(err, client){
        let result = client.login(args, function(err, result) {
        let sessionId = result.loginReturn.$value;
         console.log(sessionId);
            return {
                conn: client,
                sessionId: sessionId
                };
            });
        }); 
} 

我是通过这个流星方法调用这个方法的。

addsoapmessage(){
        let a = Meteor.call("createSoapConnection");
        console.log(a);
}

结果在控制台中变得未定义。之后会话 ID 被打印出来。我该如何解决这个问题?

【问题讨论】:

    标签: node.js web-services magento meteor soap


    【解决方案1】:

    Meteor 方法不返回任何内容。你可以请求一个回调,它会在完成后触发,但回调不会传回返回值,只有找到一个错误才会返回。

    解决这个问题的最好方法是获取将结果保存在集合中的方法,并依靠订阅让客户端反应性地看到它。

    或者,您可以将返回的数据存储在服务器变量中,然后只能由服务器代码访问(但这可能有效,因为其他服务器方法可能想要访问这些值。

    【讨论】:

      【解决方案2】:

      在你的流星调用中实现一个回调函数

       let a = Meteor.call("createSoapConnection", function (error, result) {
                      // display the error to the user and abort
                      if (error)
                          console.error(error.reason);
      
                      else {
                          console.log(result);
                      }
                  });
      

      【讨论】:

        【解决方案3】:
        meteor add zardak:soap
        

        将此软件包安装在应用程序文件夹的根目录中。然后尝试使用以下代码。

        var url = 'http://example.com/wsdl?wsdl';
        var args = {name: 'value'};
        
        try {
          var client = Soap.createClient(url);
          var result = client.MyFunction(args);
        
         return result; // or send this result to the function where ever you want.
        }
        catch (err) {
          if(err.error === 'soap-creation') {
            console.log('SOAP Client creation failed');
          }
          else if (err.error === 'soap-method') {
            console.log('SOAP Method call failed');
          }
        
        }
        

        您可以使用这些函数进行任何soap api 调用。更多详情请访问:https://atmospherejs.com/zardak/soap

        【讨论】:

        • 我在导入这个包时遇到了问题。我试过import {Soap} from 'meteor/zardak:soap';import * as Soap from 'meteor/zardak:soap';和import Soap from 'meteor/zardak:soap';。这给了我一个错误,Soap.createClient() 不是函数
        【解决方案4】:
        fuction(url,args)
        {
           soap = Npm.require('soap');
           var createClient=Meteor.wrapAsync(soap.createClient,soap);
           var client=createClient(url);
           var finalFunc=Meteor.wrapAsync(client.youfunction,soap);
           var result=finalFunc(args);
           return result;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-18
          • 2018-03-23
          • 2020-06-29
          • 1970-01-01
          相关资源
          最近更新 更多