2017-01-05 64 views
0

我正在使用Express(v4)構建API後端,並面臨我的中間件功能在我的路徑的子路徑上未被調用 的問題。例如。它被稱爲爲/電影而不是/電影/搜索在子路徑上未調用Express middlware

我有我的路線分成單獨的文件。以下是代碼,縮寫爲相關部分。

任何幫助表示讚賞!

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

check_authentication模塊應該導出中間件功能,而不是路由器。

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

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

太好了!這比使用通配符選項更清潔。 – shudder

3

看來我發現這個問題。 改變中間件觸發*修復它。

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

也許有人可以確認這是要走的路。

+0

是的,這是正確的方法 – Alex

+0

它會這樣工作,但不,不幸的是,這不是正確的方法。檢查@djones的答案。您不應該將您的check_authentication聲明爲路由器。對於這樣的事情,你應該使用中間件。不出口路由器,而不是僅僅導出函數REQ,資源和未來作爲參數。該函數中的代碼是相同的,因爲它是在你的路由器。 –

相關問題