在任何路由之前运行的中间件
middleware that run before any routes
我正在尝试进行基于令牌的身份验证。我一直忙于在任何请求发生之前运行auth。例如,下面的代码是获取用户,但一个中间件应该检查请求是否具有有效的令牌。
app.js
var user = require('./controllers/user');
app.use('/api', user);
user.js
var express = require('express');
var router = express.Router();
router.get('/user', function(req, res) {
User.find({}, function(err, users) {
res.json(users);
});
});
module.exports = router;
我有这个逻辑,但我不知道该放在哪里。
在您的app.js中,在任何路由之前,使用express‘app.use()注册令牌身份验证中间件。
这样,每次调用之后定义的路由时,都会执行令牌身份验证。基本上,app.use(身份验证)与app.use相同('*',身份验证),这意味着中间件是针对所有域执行的,而不仅仅是针对'/api'。
auth.js
module.exports = function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), 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.'
});
}
};
app.js
var express = require("express");
var app = module.exports = express();
// put the middleware before any routes in app.use()
var authentication = require("./middleware/auth");
app.use(authentication);
var user = require('./controllers/user');
app.use('/api', user);
如果你想只对"/api"路由进行令牌检查,那么就用为其定义身份验证
app.use('/api', authentication, user);
use()按照给定的顺序运行作为参数给定的函数。
把中间件放在一切之前:)
var app = express();
function myCustomMiddleware(req, res, next) {
if(/**something we need **/) {
req.haveWhatWeNeed = true;
}
return next();
}
app
.use(myCustomMiddleware)
.get(/*** everything you want***/)
;
您可以在定义任何路由之前定义中间件,以确保它们在被路由处理之前得到执行。
我从您的问题中了解到,在执行路由代码之前,您需要进行中间件检查。
var middlewareFunction = function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), 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 express = require('express');
var router = express.Router();
router.get('/user', middlewareFunction, function(req, res, next) {
User.find({}, function(err, users) {
res.json(users);
});
});
module.exports = router;
我希望这能解决你的问题。
相关文章:
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- Redux中间件在next()之前更改状态
- 快速的套接字 io 实例/中间件
- 如何使用Express'正确加载图像;s的静态中间件
- 如何在快递中制作中间件的动态链.js
- 在 Redux 中,在商店中应用中间件未正确称为化简器
- 意思是.JS中间件中的猫鼬填充不起作用
- "Cookies的这个实例“;在nodejs cookie中间件的源代码中
- Expressjs:如何跨路由共享路由中间件
- 如何在Keystone.js项目中使用Express.js中间件
- Express.js恶意路径中间件错误403
- 编写中间件'它不知道它在堆栈上的位置
- Router.use()需要中间件函数,但得到了一个未定义的函数
- Express v4:如何在参数中间件之前运行特定于路由的中间件
- 在任何路由之前运行的中间件
- 如何创建在res.render(模板渲染)之前运行的Express中间件
- Express(4.0)自定义中间件可以在router的两个实例上运行,尽管它只声明了一个实例
- 快速中间件在MongoDB查询过程中多次运行
- 快速中间件在另一个上下文中运行