Frank
Frank

Reputation: 53

node.js/express: use router.route() with middleware functions

I would like to use the method route() on an express router to service a specific route with different HTTP methods. The following code works fine:

var express = require('express');
var router  = express.Router();

router.route('/register')
  .get(adm.signUpForm)
  .post(adm.signUp);

However, when trying to use a middleware on the post route, I'm getting stuck. The following code works:

// LOGIN processing
router.post('/login', passport.authenticate("local", {
  successRedirect: '/',
  failureRedirect: '/login'
}), function(){
  //empty
});

Here, the middleware function passport.authenticate(...) is called to check if the user credentials are valid or not. Authenticated users get re-directed to the homepage at "/"; Unknown users (or with incorrect password) get re-directed back to the "/login" form.

Now, I would like to re-factor this code and use something similar to the code example shown above (sign-up route), i. e. I would like to use router.route('/login).xxxx to service HTTP request xxxx on route '/login'. How can I tell express to use my passport.authenticate middleware function on the POST request to '/login'?

router.route('/login')
  .get(adm.loginForm)
  .post(<my-middleware-function ???>, adm.login);

... where adm.loginForm is the end-point function that issues the login form upon a GET request to /login and adm.login is the end-point function that should be called when the server receives a POST request on this route, i. e. once the login form is submitted.

To the best of my knowledge, the express (4.x) documentation doesn't mention anything about installing a middleware function for a specific route and (at the same time) a specific HTTP request. I know that router.route('/login').use() can be used to install a middleware function for all HTTP requests on this route, but I only want my middleware to be called upon POST requests.

Any suggestions? Thanks.

Upvotes: 2

Views: 136

Answers (1)

MattB
MattB

Reputation: 1104

You can add them where you mentioned:

router.route('/login').post(checkPassport, adm.login)

You can also chain them together:

router.route('/login').post(checkPassport).post(adm.login)

checkPassport is the middleware you'll need to write that handles the passport authentication logic

Upvotes: 1

Related Questions