0

I'm using ActionHero in node.js and Angular.js.

I am trying images send to ActionHero using $http method. but I don't know How many images are made. so I can't define the parameter names on action in ActionHero.

below is my source.

First. images are in object, so I change object to each parameter.

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);
    });

  }

Second. make formData in sendUrlFile like source below. and then send to 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;
      }
    });

Third. ActionHero is received. but parameter isn't defined so ActionHero can't receive.

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'
  } 

So I have two Questions:

  1. How can actionhero receive the parameter without inputs defined?
  2. Can I object with Image Data send to ActionHero by Ajax?

Thank You.

tanmay
  • 7,761
  • 2
  • 19
  • 38
EddyKim
  • 155
  • 1
  • 14

2 Answers2

0

I change reduceParams function in actionProcessor.js.

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];
        }
      }
    }
  }
};

i can define on inputs like below.

'img_*' : {required: false}
EddyKim
  • 155
  • 1
  • 14
0

and Then I make middleware

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();
EddyKim
  • 155
  • 1
  • 14