0

とにかく、特定のアクションにいくつかのミドルウェアを追加することはありますか? 私の知る限り、 addPreProcessor はすべてのアクションにミドルウェアを追加するからですか? 一部のアクションで認証やその他のチェックを行いたくない場合、解決策はありますか?

短期的な解決策がありますが、アクションを定義するときに特定のミドルウェアを割り当てることができればいいと思います(実行する必要があるミドルウェア名の配列を順番に与えるなど)

私の現在の解決策は、ミドルウェアをそれらに適用する必要があるすべてのアクションの配列を保持し、それを connection.aciton に対してチェックすることですが、それでもすべてのリクエストがすべてのミドルウェアを通過し、それが渡されます。私には効果的ではないように聞こえます!

exports.middlewares = function(api, next){

    var myImportantMiddleware = function(connection, actionTemplate, next) {

        var actionsToBeChecked = ['deposit'];
        var action = connection.action;

        if(actionsToBeChecked.indexOf(action) > -1) {
                /*  middleware logic 
                next(connection, true); */
        } else {
            next(connection, true);
        }
    }

    api.actions.addPreProcessor(myImportantMiddleware);

    next();
}

前もって感謝します !

4

2 に答える 2

1

すべてを行う必要はありません。ドキュメントからこの例を確認してください: https://github.com/evantahler/actionhero-tutorial/blob/master/initializers/middleware.js

exports.middleware = function(api, next){

  var authenticationMiddleware = function(connection, actionTemplate, next){
    if(actionTemplate.authenticated === true){ // <-- HERE
      api.users.authenticate(connection.params.userName, connection.params.password, function(error, match){
        if(match === true){
          next(connection, true);
        }else{
          connection.error = "Authentication Failed.  userName and password required";
          next(connection, false);
        }
      });
    }else{
      next(connection, true);
    }
  }

  api.actions.addPreProcessor(authenticationMiddleware);

  next();
}

はい、すべてのアクションに対してすべてのミドルウェアが起動しますが、ミドルウェアにアクションの定義を調べて特定のプロパティを探すように指示できます。この場合、アクションが次のように見えるかどうかだけを気にします。

exports.randomNumber = {
  name: 'randomNumber',
  description: 'I am an API method which will generate a random number',
  outputExample: {
    randomNumber: 0.123
  },

  authenticated: true // <<--- HERE

  run: function(api, connection, next){
    connection.response.randomNumber = Math.random();
    next(connection, true);
  }

};
于 2015-01-11T06:08:48.747 に答える
-1

わかりました、より良い解決策を見つけたと思います。あなたの意見を知りたいです。

middlewares : ['middlewareOne', 'middlewareTwo']そのため、実行順序が配列内のミドルウェア名の順序と等しいアクションに追加したところ、ミドルウェア初期化子は次のようになります

var async = require('async');

exports.middlewares = function(api, next){

    var middlewares = {

        authMiddleware : function(connection, next){
            /* Middleware logic */
        },

        premiumAccessMiddleware : function(connection, next){
            /* Middleware logic */
        },

        adminAccessMiddleware : function(connection, next){
            /* Middleware logic */
        }

    };


    var middlewareProcessor = function(connection, actionTemplate, next){

        var actionMiddlewares = actionTemplate.middlewares;

        async.eachSeries(actionMiddlewares, function(middlewareName, callback){

            var middleware = api.middlewares[middlewareName];

            if(!middleware) throw (new Error("Middleware '"+ middlewareName +"'doesn't exist"));  /* In case I had a typo */

            middleware(connection, function(new_connection, toRender){

                connection = new_connection;

                if(toRender){

                    callback();

                }else{

                    callback('YOU SHALL NOT PASS');
                }

            });

        }, function(err){

            // if(err) return next(connection, false); // see EDIT1

            next(connection, true);

        });

    }

    api.actions.addPreProcessor(middlewareProcessor);

    next();
} 

何かご意見は?

EDIT1:next(connection, false);ユーザーに何も送信しないでください。実行ミドルウェアのいずれかが成功せずにnext(connection, false). next(connection, true);この場合、eachSeries の最終的なコールバック関数では、常に!!を使用する必要があると思います。

于 2015-01-11T03:21:52.023 に答える