2017-01-19 29 views
0

我在node.js和Angular.js中使用ActionHero。Actionhero如何在沒有定義輸入的情況下接收參數?

我想圖像發送到ActionHero使用$ http方法。 但我不知道有多少圖像。 所以我無法在ActionHero中定義參數名稱。

以下是我的源代碼。

首先。圖像在對象中,所以我將對象更改爲每個參數。

insert: function (param, next) { 

    var url = settings.apiUrl + "/api/online/productAdd"; 
    var vdata = { 
     img_objects  :param.img_objects 
    }; 

    angular.forEach(param.img_objects, function (v, k) { 
     vdata['img_file'+(k)] = v.files; 
    }); 

    commonSVC.sendUrlFile("POST", url, vdata, function (state, data) { 
     next(state, data); 
    }); 

    } 

二。使formDatasendUrlFile像下面的源代碼。然後發送給actionHero。

var promise = $http({ 
     method: method, 
     url: url, 
     headers: { 
     'Content-Type': undefined 
     }, 
     data: params, 
     transformRequest: function (data) { 
     var formData = new FormData(); 
     angular.forEach(data, function (value, key) { 
      if(angular.isObject(value)){ 
      if(value.lastModified > 0 && value.size > 0){ 
       formData.append(key, value); 
      }else{ 
       formData.append(key, JSON.stringify(value)); 
      } 
      }else{ 
      formData.append(key, value); 
      } 
     }); 
     return formData; 
     } 
    }); 

三。收到ActionHero。但是參數未定義,因此ActionHero無法接收。

exports.productAdd = { 
    name: 'online/productAdd', 
    inputs: { 
    I don't know How Many Images are made? 1~10? or 1~100? 
    }, 
    authenticate: true, 
    outputExample: { 
    'result':'success' 
    } 

所以我有兩個問題:

  1. 如何actionhero接收定義不輸入的參數?
  2. 我可以用Ajax將圖像數據發送給ActionHero嗎?

謝謝。

回答

0

我更改了actionProcessor.js中的reduceParams函數。

api.actionProcessor.prototype.reduceParams = function(){ 
    var self = this; 

    var inputNames = []; 
    if(self.actionTemplate.inputs){ 
    inputNames = Object.keys(self.actionTemplate.inputs); 
    } 

    // inputs * 확인 2017-01-20 Eddy 
    var multi = []; 
    var strArray; 

    for(var v in inputNames){ 
    if(inputNames[v].indexOf("*") != -1){ 
     strArray = inputNames[v].split('*'); 
     multi.push(strArray[0]); 
    } 
    } 

    var multiLength = multi.length; 
    var flag; 

    if(api.config.general.disableParamScrubbing !== true){ 
    for(var p in self.params){ 
     flag = true; 

     if(multiLength > 0){ 
     for(var i=0; i<multiLength; i++){ 
      if(p.indexOf(multi[i]) != -1){ 
      flag = false; 
      } 
     } 
     } 

     if(flag){ 
     if(api.params.globalSafeParams.indexOf(p) < 0 && inputNames.indexOf(p) < 0){ 
      delete self.params[p]; 
     } 
     } 
    } 
    } 
}; 

我可以定義如下輸入。

'img_*' : {required: false} 
0

,然後我做中間件

var actionHeroMiddleware = { 
    name: '-', 
    global: true, 
    priority: 1000, 
    preProcessor: function(data, next) { 
    api.actionProcessor.prototype.reduceParams = function(){ 
     var self = this; 

     var inputNames = []; 
     if(self.actionTemplate.inputs){ 
     inputNames = Object.keys(self.actionTemplate.inputs); 
     } 

     // inputs * 확인 2017-01-20 Eddy 
     var multi = []; 
     var strArray; 

     for(var v in inputNames){ 
     if(inputNames[v].indexOf("*") != -1){ 
      strArray = inputNames[v].split('*'); 
      multi.push(strArray[0]); 
     } 
     } 

     var multiLength = multi.length; 
     var flag; 

     if(api.config.general.disableParamScrubbing !== true){ 
     for(var p in self.params){ 
      flag = true; 

      if(multiLength > 0){ 
      for(var i=0; i<multiLength; i++){ 
       if(p.indexOf(multi[i]) != -1){ 
       flag = false; 
       } 
      } 
      } 

      if(flag){ 
      if(api.params.globalSafeParams.indexOf(p) < 0 && inputNames.indexOf(p) < 0){ 
       delete self.params[p]; 
      } 
      } 
     } 
     } 
    }; 
    next(); 
    }, 
    stop: function(api, next) { 
    next(); 
    } 
}; 

api.actions.addMiddleware(actionHeroMiddleware); 
next(); 
相關問題