expressjs-注入中间件路由失败

我有多个路由页面。 我们称之为父母路由(index.js)和子路由(child1.js,child2.js)。 所有这些页面都有多个指定的路由。 其中一些需要得到保护,有些则不受保护。

在JSON web令牌和jsonwebtoken包的帮助下,我创build了一个中间件来检查用户是否可以访问特定的路由。 用户只有通过有效的JSON令牌才能访问它们。 这是受保护的路线。 对于不受保护的路线,不需要这样的事情。

我将中间件保存在一个单独的页面中,然后使用module.exports将其导出到路由页面,然后将其注入到受保护的路由中。

但它不工作。 我试图使用POSTMAN客户端访问受保护的路由,但请求永远不会被发送。 装载机微调器显示。

这是我的代码:

AUTH-middleware.js

 module.exports = function () { return function (req, res, next) { // check header or url parameters or post parameters for token var token = req.body.token || req.query.token || req.headers['x-access-token']; // decode token if (token) { // verifies secret and checks exp jwt.verify(token, config.secret, function (err, decoded) { if (err) { return res.json({ success: false, message: 'Failed to authenticate token.' }); } else { // if everything is good, save to request for use in other routes req.decoded = decoded; next(); } }); } else { // if there is no token // return an error return res.status(403).send({ success: false, message: 'No token provided.' }); } } } 

我的父路由:index.js

 var router = require('express').Router(); var protected = require('./auth-middleware')(); var childRoute1 = require('./child1'); var childRoute2 = require('./child2'); router.use('/child1', childRoute1); router.use('/child2', childRoute2); //unprotected parent route router.get('/', function (req, res, next) { res.json('Unprotected route 1!'); }); //unprotected parent route router.get('/albums/what',protected, function (req, res, next) { res.json('album!'); }); router.route('/login').post(User.loginUser); module.exports = router; 

我的孩子路线1:child1.js

 var child1Router = require('express').Router(); var protected = require('./auth-middleware')(); var ChildC = require('../controllers/childController'); child1Router.route('/all',protected).get(ChildC.fetchAllChildData); //protected child1Router.route('/my').get(ChildC.fetchMyChildData); //unprotected module.exports = child1Router; 

child2类似于child1。 所以我不包括它。

UPDATE

我已经在app.js文件中包含了bodyparsing器(主文件)

 const express = require('express'); var bodyParser = require('body-parser'); app = express(); var routes = require('./routes/index'); var port = process.env.PORT || 3000; //set our port //configure body parser app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use('/api', routes); app.use(function (req, res) { res.status(404).send({ url: req.originalUrl + ' not found' }) }); app.listen(port); console.log('Magic happens on port ' + port); module.exports = app; 

您可以使用verify方法将中间件作为对象导出,如下所示:

AUTH-middleware.js

 module.exports = { verify: function (req, res, next) { // check header or url parameters or post parameters for token var token = req.body.token || req.query.token || req.headers['x-access-token']; // decode token if (token) { // verifies secret and checks exp jwt.verify(token, config.secret, function (err, decoded) { if (err) { return res.json({ success: false, message: 'Failed to authenticate token.' }); } else { // if everything is good, save to request for use in other routes req.decoded = decoded; next(); } }); } else { // if there is no token // return an error return res.status(403).send({ success: false, message: 'No token provided.' }); } } } 

你现在可以要求var authMiddleware = require('../auth-middleware');

index.js

 var router = require('express').Router(); var authMiddleware = require('./auth-middleware'); var childRoute1 = require('./child1'); var childRoute2 = require('./child2'); router.use('/child1', childRoute1); router.use('/child2', childRoute2); // unprotected parent route router.get('/', function (req, res, next) { res.json('Unprotected route 1!'); }); // protected parent route router.get('/albums/what', authMiddleware.verify, function (req, res, next) { res.json('album!'); }); router.route('/login').post(User.loginUser); module.exports = router; 

或者你可以在router.user下放置受保护的路由,如下所示:

  router.use('/child1', childRoute1); router.use('/child2', childRoute2); // unprotected parent route router.get('/', function (req, res, next) { res.json('Unprotected route 1!'); }); router.route('/login').post(User.loginUser); // route middleware to verify token router.use(authMiddleware.verify); // protected parent route router.get('/albums/what', function (req, res, next) { res.json('album!'); });