节点 JS 控制器 - 调用具有回调的函数

Node JS Controller - invoking a function that has a callback

我的控制器是一个soap客户端,如下图

    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;

此 soap 服务提供将在后续请求中使用的会话 ID。因此,我想使用 'memoize' 来缓存方法。

我定义了一个环绕 soap 调用的方法并 'memoize'ing 它,但问题是没有发生对 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. 您没有指定您希望 memoize 将哪些参数用于缓存,也没有指定您获取这些值的位置。对于此示例,我将假设它是用户名、密码和 wsdlUrl。并且它们是直接在 req.
  3. 中设置的

.

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;