2017-01-05 4 views
0

Ich bin ein API-Backend mit Express (v4) und mit einem Problem, dass meine Middleware-Funktion nicht auf Teilwege meiner Route aufgerufen. Z.B. Es heißt /Film aber nicht für /Film/Suche.Express Middleware nicht auf Teilpfaden

Ich habe meine Routen in separate Dateien aufgeteilt. Unten ist der Code, verkürzt auf die relevanten Teile.

Jede Hilfe ist willkommen!

app.js

var express = require('express'); 
var app = express(); 
var router = require('routes')(app); 

/routes/index.js

module.exports = function(app) { 
    app.use('/movie', check_authentication, require('movie')); 
}; 

/routes/movie.js

var Movie = require(../models/movie'); 

// Middleware is working for this route (/movie?movie_id=123) 
router.get('/', function(req, res) { 

    Movie.findById(req.query.movie_id) 
     .then(function(movie) { 
      res.status(200).json(movie); 
     }, function(err) { 
      res.status(400).send(err); 
     }); 
}); 

// Middleware is NOT working for this route (/movie/search?keyword=matrix) 
router.get('/search', function(req, res) { 

    Movie.findById(req.query.keyword) 
     .then(function(movie) { 
      res.status(200).json(movie); 
     }, function(err) { 
      res.status(400).send(err); 
     }); 
    }); 

/routes/check_authentication.js

var express   = require('express'); 
var router   = express.Router(); 
var firebaseAdmin = require('firebase-admin'); 
var path   = require('path'); 
var config   = require(path.resolve(__dirname, '../config/config.json')); 

firebaseAdmin.initializeApp({ 
    credential: firebaseAdmin.credential.cert(path.resolve(__dirname, '../config/' + config.firebase.serviceAccount)), 
    databaseURL: config.firebase.databaseURL 
}); 

// AUTHENTICATION MIDDLEWARE 
// needs to be included in any request which requires authorization 
// ============================================================================= 
router.all('/', function(req, res, next) { 

    // check if authorization header is present 
    var token = req.headers['authorization']; 
    if (typeof token === 'undefined') { 
     res.status(403).json({ Error: 'Unauthenticated' }); 
    } 
    else { 
     firebaseAdmin.auth().verifyIdToken(token).then(function(decodedToken) { 
      req.email = decodedToken.email; 
      next(); // all good. go ahead with the request 
     }).catch(function(error) { 
      res.status(403).json({ Error: 'Unauthenticated' }); 
     }); 
    } 
}); 

module.exports = router; 

Antwort

2

Das check_authentication-Modul sollte die Middleware-Funktion exportieren, kein Router.

module.exports = function(req, res, next) { 

    // check if authorization header is present 
    // ... 
}); 
+0

Großartig! Das ist viel sauberer als die Wildcard-Option. – shudder

3

Es scheint, dass ich das Problem gefunden. Wenn Sie die Middleware für das Auslösen ändern *, wird sie repariert.

router.all('*', function(req, res, next) 

Vielleicht kann jemand bestätigen, dass dies der richtige Weg ist.

+0

Ja, das ist der richtige Weg – Alex

+0

Es wird so funktionieren, aber nein, es ist leider nicht der richtige Weg. Überprüfen Sie die Antwort von @djones. Sie sollten Ihre check_authentication nicht als Router deklarieren. Für solche Dinge sollten Sie eine Middleware verwenden. Exportieren Sie keinen Router, sondern exportieren Sie einfach eine Funktion mit req, res und next als Parameter. Der Code in der Funktion ist derselbe wie in Ihrem Router. –