当前位置: 代码迷 >> JavaScript >> Node JS Controller-调用具有回调的函数
  详细解决方案

Node JS Controller-调用具有回调的函数

热度:141   发布时间:2023-06-05 14:19:46.0

我的控制器是一个肥皂客户端,如下所示

    var _ = require('lodash'),
    memoize = require('memoize'),
    soap = require('soap'),
    http = require('http');
    var wsdlUrl = 'http://www.proxixnetwork.com/gsert/PxPointGeocode.asmx?WSDL';

    var geocode = function(req,res){
      var sessionId = null;
      soap.createClient(wsdlUrl, function(err,client){
          var args = {"username":'user123', "password":'password123'};
          client.PxPointGeocode.PxPointGeocodeSoap.Authenticate(args,function(err,result){
          res.jsonp(result.AuthenticateResult.SessionID);
        })

      });

    }

    exports.authenticate = geocode;

此肥皂服务提供一个会话ID,该ID将在后续请求中使用。 因此,我想使用“记忆”来缓存该方法。

我定义了一个方法来包装soap调用并对其进行“记忆”,但是问题是对soapClient的调用没有发生。

我不知道如何使来自路由器的呼叫等待soap呼叫注意:还尝试了异步库的瀑布,但没有用。

    var _ = require('lodash'),
      memoize = require('memoize'),
      soap = require('soap'),
      http = require('http'),
      wsdlUrl = 'http://www.proxixnetwork.com/gsert/PxPointGeocode.asmx?WSDL';

    var getSession = function () {

      var args = {"username": 'user123', "password": 'password123'};
      var sessionId = null;
      soap.createClient(wsdlUrl, function (err, client) {
        console.log('Inside proxix client'); //not printing
        client.PxPointGeocode.PxPointGeocodeSoap.Authenticate(args, function (err, result) {
          sessionId= result.AuthenticateResult.SessionID; 
        //if I use res.jsonp() - the call could be made 
        })

      });
    return sessionId;
    };

    var cached = memoize(getSession);

    var geocode = function (req, res) {
      var sesssionObj = cached();
      res.jsonp(sessionObj);

    }
    exports.authenticate = geocode;

我看到的两个问题是:

  1. memoize是一种缓存机制,但绝不会改变您函数的异步特性。 返回sessionId将不起作用,因为在到达该行之前未设置它。 您需要使用回调。
  2. 您尚未指定要记住要用于缓存的参数,也没有指定从何处获取这些值。 在本示例中,我将假设用户名,密码和wsdlUrl。 并直接在要求中设置它们。

var _ = require('lodash'),
memoize = require('memoize'),
soap = require('soap'),
http = require('http');

var getSessionId = function(username,password,wsdlUrl,callback){
    soap.createClient(wsdlUrl, function(err,client){
        var args = {"username":username, "password":password};
        client.PxPointGeocode.PxPointGeocodeSoap.Authenticate(args,function(err,result){
            if(err){
                return callback(err);
            }
            callback(null,result.AuthenticateResult.SessionID);
        })
    });
});

var getSessionIdCached = memoize(getSessionId,{async:true});

var geocode = function(req,res){
    getSessionIdCached(req.username,req.password,req.wsdlUrl,function(err,sessionId){
        if(err){
            //do some error handling, and probably return
        }
        res.jsonp(sessionId);
    });
});

exports.authenticate = geocode;
  相关解决方案