0

我在 node.js 和 Angular.js 中使用 ActionHero。

我正在尝试使用 $http 方法将图像发送到 ActionHero。但我不知道制作了多少张图片。所以我无法在 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 的图像数据来反对吗?

谢谢你。

4

2 回答 2

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}
于 2017-01-20T05:19:12.043 回答
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();
于 2017-01-20T07:15:11.470 回答