【问题标题】:How can Actionhero receive the parameter without inputs defined?Actionhero 如何在没有定义输入的情况下接收参数?
【发布时间】:2017-06-03 16:47:20
【问题描述】:

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

  }

第二。在sendUrlFile 中制作formData,如下面的来源。然后发送给 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 的图像数据来反对吗?

谢谢。

【问题讨论】:

    标签: javascript jquery angularjs node.js actionhero


    【解决方案1】:

    然后我做中间件

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

    【讨论】:

      【解决方案2】:

      我在 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}
      

      【讨论】:

        猜你喜欢
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多