2016-08-17 2 views
1

Node.jsアプリケーションに問題があります。要するに、私のミドルウェア機能には、reqresnext以外のカスタムパラメータを渡したいと思います。Expressミドルウェアでのカスタムパラメータの提供

ミドルウェアファイル:

var DB = require('./DB.js'); 

function requirePermissions(e) { 
    console.log('nope') 
} 

module.exports = requirePermissions; 

ルート:

router.post('/posts', requirePermissions('post_creation'), function(req, res)  { 
    var o  = req.body, 
     title = o.post.title, 
     content = o.post.content; 

    res.send('made it'); 
}); 

私は機能requirePermissions(req, res, next) {}を使用して動作することを確認しているが、私は私自身のパラメータを含める方法を理解していません。

+0

何のパラメータ? httpリクエストに渡されるものとは異なっていますか? (私はクエリパラメータなどを意味します) –

答えて

2

あなたの機能requirePermissionsは実際のミドルウェアになります別の関数を返す必要があります。

function requirePermissions(e) { 
    if (e === 'post_creation') { 
    return function(req, res, next) { 
     // the actual middleware 
    } 
    } else if (e === 'something_else') { 
    return function(req, res, next) { 
     // do something else 
    } 
    } 
} 

をあなたもそのようにそれを行うことができます:あなたは自分のミドルウェアのための匿名関数を作成することができます

function requirePermissions(e) { 
    return function(req, res, next) { 
    if ('session' in req) { 
     if (e === 'post_creation') { 
     // do something 
     } else if (e === 'something_else') { 
     // do something else 
     } 
    } 
    } 
} 
1

追加の引数を使用して実際の関数を呼び出すことができます:

router.post('/posts', function(req, res, next) { 
     requirePermissions('post_creation', req, res, next); 
    }, function(req, res) { 
     var o = req.body, 
     title = o.post.title, 
     content = o.post.content; 

     res.send('made it'); 
}); 

または、引数をpreprendする.bind()を使用することができます。

router.post('/posts', requirePermissions.bind('post_creation'), function(req, res) { 
     var o = req.body, 
     title = o.post.title, 
     content = o.post.content; 

     res.send('made it'); 
}); 

これは、このような四つの引数を使ってrequirePermissions()関数を呼び出します。

requirePermissions('post_creation', req, res, next) 
+0

'.bind()'オプションを追加しました。 – jfriend00

関連する問題