在子路径上没有调用Express middlware

时间:2017-01-05 13:52:46

标签: node.js express

我正在使用Express(v4)构建API后端,并面临一个我的中间件函数未被调用的问题 在我路线的子路径上。例如。它被称为 / movie 但不适用于 / movie / search

我已将路线拆分为单独的文件。以下是代码,缩写为相关部分。

感谢任何帮助!

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;

2 个答案:

答案 0 :(得分:3)

我似乎发现了这个问题。 更改中间件以触发*修复它。

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

也许有人可以确认这是要走的路。

答案 1 :(得分:2)

check_authentication模块应该导出中间件功能,而不是路由器。

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

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