我正在构建一个Node / Express.js webapp,我不希望webapp的任何用户访问除索引,忘记传递和重置之外的页面而不登录。我正在使用此重置路由重置密码。所以我在/ reset /之后发送一个随机令牌(例如:www./reset/4c1ff3ada180bea9da6333fd9555dd100828d530)。我已经设置了一个基本的中间件来限制访问其他页面而无需登录。
这是我的中间件。
'use strict';
var express = require('express');
module.exports = {
isLoginCheck : function (request, response, next) {
if(!request.session.user && request.path != '/index' && request.path != '/forgot-pass' && request.path != '/forgot' && request.path != '/reset/*'){
response.redirect('/index');
}else{
next();
}
},
};
但是/ reset / *与我的路由不匹配,因此会将我抛回索引页面。我需要在/ reset /之后发送令牌,以便我可以查询数据库以重置密码。
那么如何在/ reset /?
之后指定任何随机字符串这是/ reset的路由器。
router.get('/reset/:token', indexController.pagesReset);
答案 0 :(得分:0)
问题来自您的情况,路径(如果您在/reset/egze5g
上的情况不是/reset/*
而是/reset/egze5g
。
您可以使用正则表达式替换此条件:request.path.match(/\/reset\/[\w]+/)
以防万一:你可以通过
替换你满意的条件来清理你的代码 if (!request.session.user && !['/index', '/forgot-pass', '/forgot'].includes(request.path) && !request.path.match(/\/reset\/[\w+]/)){
答案 1 :(得分:0)
此正则表达式捕获/reset/
之后的所有内容。
(?:\/reset\/)(.+)
var myString = "/reset/fhlkejg234hk";
var myRegexp = /(?:\/reset\/)(.+)/g;
var token = myRegexp.exec(myString)[1];
console.log(token);
答案 2 :(得分:0)
为了更好地扩展,请尝试这样的事情
'use strict';
const express = require('express');
let app = express();
app.use('/users/:user_id', function(req, res, next) {
console.log(req.params.user_id);
res.send(req.params.user_id);
});
app.use(["/index","/forgot"], function (req, res, next) {
console.log("For index")
res.send("For index/forgot")
});
app.use("/", function (req, res, next) {
console.log("For all other links")
res.send("For all other links")
});
app.listen("2010",()=>console.log("Server at 2010"));
请参阅https://expressjs.com/en/guide/writing-middleware.html以便在快递中创建中间件