123

我在node.js中使用Express框架和一些中间件功能:

var app=express.createServer(选项);app.use(User.checkUser);

我可以使用.使用带有附加参数的函数,以便仅在特定路径上使用此中间件:

app.use('/userdata',User.checkUser);

是否可以使用路径变量,以便中间件用于除特定路径(即根路径)之外的所有路径?

我正在考虑这样的事情:

app.use('!/',User.checkUser);

所以用户.检查用户始终调用,根路径除外。

8个答案8

重置为默认值
200

我会将checkUser中间件添加到除主页之外的所有路径中。

app.get('/',routes.index);app.get('/account',checkUser,routes.account);

app.all('*',checkUser);功能检查用户(req、res、next){如果(req.path=='/')返回next();//验证用户身份next();}

您可以对此进行扩展,以搜索非身份验证路径数组中的req.path:

功能检查用户(req、res、next){const nonSecurePaths=['/','/about','/contact'];if(nonSecurePaths.includes(req.path))返回next();//验证用户身份next();}
4
  • 1
    是否可以允许所有请求指向特定路径,但不允许子路径?(即“/”、“/style.css”、“/backage.jpg”,但不是“/lists/”或“/titles”)
    – 托马斯
    评论 2012年10月17日10:04
  • 您的静态资产应该从静态目录中提供。
    – 香菜
    评论 2012年10月17日17:56
  • @chovy如何在非安全路径中指定正则表达式路径 评论 2022年2月14日10:03
  • 我不知道你在问什么
    – 香菜
    评论 2022年2月14日23:22
19

您还可以在每个路由上设置中间件。

//创建应用程序/x-www-form-urlencoded解析器var urlencodedParser=bodyParser.urlencoded({extended:false})//POST/login获取urlencode主体app.post('/login',urlencodedParser,函数(req,res){如果(!req.body)返回res.sendStatus(400)res.send(“欢迎”+req.body.username)})
0
13

而不是直接注册用户.检查用户作为中间件,注册一个新的助手函数,比如检查用户筛选器,它在每个URL上被调用,但只在给定的URL上将执行传递给userFiled`。示例:

var checkUserFilter=函数(req、res、next){if(req.parsedUrl.pathname==='/'){next();}其他{User.checkUser(req,res,next);}}app.use(checkUserFilter);

理论上,您可以提供regexp路径以应用程序使用例如:

app.use(/^\/.+$/,checkUser);

在3.0.0rc5特快列车上尝试过,但不起作用。

也许我们可以开一张新票并建议将其作为一个功能?

1
  • 我认为只有v4支持此功能。 评论 2020年11月20日0:11
7

解决方案是使用设置api和中间件的顺序。在你的情况下,肯定是这样的。

var app=express.createServer(选项);//在此处和设置User.checkUser之前,放置所有不想使用的apiapp.use(“/”,(req,res)=>res.send(“checkUser中间件未调用”);app.use(User.checkUser);//将您想要使用的每个api放入checkUserapp.use(“/userdata”,User.checkUser,(req,res)=>res.send(“checkUser called!”));

这是一个完整的例子。

const express=要求(“express”);const应用=表达式();常量端口=3002;app.get(“/”,(req,res)=>res.send(“hi”));app.use((请求、资源、下一个)=>{console.log(“检查用户”);next();});app.get(“/checkedAPI”,(req,res)=>res.send(“checkUser called”);app.listen(端口,()=>{console.log(`Server started at port${port}`);});
6

使用

app.use(/^(\/.+|(?!\/).*)$/,函数(req,resp,next){。。。

这将传递除/之外的任何url。除非它对我有用。

一般来说

/^(\/path.+|(?!\/path).*)$/

(请参见如何否定正则表达式中的特定单词?)

希望这有帮助

1
  • 另一个例子,仅仅因为“/”在尝试读取正则表达式时是一个困难的例子:/^((?!\/foo$).*)$/如中所示app.use(/^((?!\/foo$).*)$/,快递。。。。结合来自的信息这条评论
    – 罗布
    评论 2023年8月4日4:27

使用名为无表情的

要求对每个请求进行身份验证,除非路径是index.html。

app.use(需要身份验证,除非({路径:['/index.html',{url:“/”,方法:[“GET”,“PUT”]}]}))

路径它可以是字符串、正则表达式或其中任何一个的数组。它也可以是一个对象数组,即URL和方法key-pair。如果请求路径或路径与方法匹配,中间件将不会运行。

这个图书馆一定会帮助你。

2

对我有效的方法是在初始化所有检查之前初始化您想要的单个路由,例如:

var app=express.createServer(选项);app.get('/',routes.index);app.use(User.checkUser);

我个人的例子如下:

const应用=表达式();...app.use('/api/flow',flowLimiter,flowRouter);应用程序使用(csurf({cookie:错误,}));...

所以csurf公司应用了除api/流-我在其中使用sendBeacon,因此无法对其应用带有标记的标头。

0

@chovy的解决方案是最好的。

另一个解决方案是:

我也面临着类似的问题。所以我所做的是将“routes”文件中的函数拆分为不同的文件,并分别导出它们。同样,我将它们分别导入到“服务器”文件中,并为各自的路由调用中间件。但我不会大规模推荐这种方法,我有一个不到10条路线的小项目,所以我不介意这样做。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.