web-dev-qa-db-ja.com

特定のパスを除くすべてのパスに対してExpressで特定のミドルウェアを使用する

Node.jsのExpressフレームワークをいくつかのミドルウェア機能とともに使用しています。

var app = express.createServer(options);
app.use(User.checkUser);

.use関数を追加のパラメーターとともに使用して、特定のパスでのみこのミドルウェアを使用できます。

app.use('/userdata', User.checkUser);

特定のパス(ルートパス)を除くすべてのパスにミドルウェアが使用されるように、パス変数を使用することは可能ですか?

私はこのようなことを考えています:

app.use('!/', User.checkUser);

したがって、ルートパスを除き、User.checkUserは常に呼び出されます。

57
Thomas

ホームページを除くすべてのパスにcheckUserミドルウェアを追加します。

app.get('/', routes.index);
app.get('/account', checkUser, routes.account);

または

app.all('*', checkUser);

function checkUser(req, res, next) {
  if ( req.path == '/') return next();

  //authenticate user
  next();
}

これをアンダースコアで拡張して、認証されていないパスの配列でreq.pathを検索できます。

function checkUser(req, res, next) {
  var _ = require('underscore')
      , nonSecurePaths = ['/', '/about', '/contact'];

  if ( _.contains(nonSecurePaths, req.path) ) return next();

  //authenticate user
  next();
}
92
chovy

User.checkUserをミドルウェアとして直接登録する代わりに、すべてのURLで呼び出されるが特定のURLでのみuserFiled`に実行を渡すcheckUserFilterなどの新しいヘルパー関数を登録します。例:

var checkUserFilter = function(req, res, next) {
    if(req._parsedUrl.pathname === '/') {
        next();
    } else {
        User.checkUser(req, res, next);
    }
}

app.use(checkUserFilter);

理論的には、app.useへの正規表現パスを提供できます。たとえば、次のようなものです。

app.use(/^\/.+$/, checkUser);

Express 3.0.0rc5で試してみましたが、機能しません。

おそらく 新しいチケットを開く で、これを機能として提案できますか?

8
jsalonen

ミドルウェアは各ルートごとに設定できます。

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})

つかいます

app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){...

これは、/以外のURLを渡します。場合を除き、それは私のために動作します。

一般に

/^(\/path.+|(?!\/path).*)$/

正規表現で特定の単語を無効にする方法 を参照)

お役に立てれば

2
user1872904

express-unless と呼ばれるこのライブラリを使用します

パスがindex.htmlでない限り、すべてのリクエストに認証を要求します。

app.use(requiresAuth.unless({
  path: [
    '/index.html',
    { url: '/', methods: ['GET', 'PUT']  }
  ]
}))

パスは、文字列、正規表現、またはそれらの配列のいずれかです。また、URLとメソッドのキーペアであるオブジェクトの配列にすることもできます。要求パスまたはパスとメソッドが一致する場合、ミドルウェアは実行されません。

このライブラリはきっとあなたを助けます。

1
Abhay Shiro