Comments (17)
maybe forRoutes
return the method exclude
, so you can exclude right after defining routes for which to apply the middleware.
consumer
.apply(AuthMiddleware)
.forRoutes({ path: '*', method: RequestMethod.ALL })
.exclude({ path: '/auth', method: RequestMethod.ALL }) //or `excludeRoutes`
from nest.
Why not have both 🎉
from nest.
For those interested, I needed similar functionality in some of my middleware, particularly my AuthModule where I needed to allow access to one route, but not the rest in a particular controller. I followed this, and wanted to come up with a more standardised way of excluding the route.
consumer
.apply(AuthMiddleware)
.with(
{ path: '/public/content/within/private/controller', method: RequestMethod.GET }
)
.forRoutes(PrviateContentController)
And my middleware as follows
interface Route {
path: string;
method: string;
}
@Middleware()
export class AuthMiddleware implements NestMiddleware {
async resolve(...excludedRoutes: Route[]): Promise<ExpressMiddleware> {
return async (req, res, next) => {
if(
excludedRoutes.filter(excludedRoute => {
return excludedRoute.path == req.path && (excludedRoute.method === RequestMethod[req.method] || req.method === RequestMethod.ALL);
}).length
){
next();
}else{
runMyAuthMethod(req, res, next);
}
};
}
}
Let me know what you think/any improvements as I am still learning.
from nest.
@kamilmysliwiec Can you reopen this issue or do you reject the feature as suggested by @wbhob ? I agree it would be very handy.
My example use case:
I have a global JWT authentication which is supposed to be disabled for the status route (where you can check the API's status) though.
from nest.
I was referring to a hypothetical case, it all depends on the requirements.
in fact I was researching and I found this package.
This it has about 165,622 downloads on the last month, therefore it can be considered that the exclusion of routes in a middleware is a common need of hight demand for many people.
from nest.
Hi @cdiaz,
You can just use with()
to pass custom arguments to resolve()
method.
resolve(path) {
return (req, res, next) => {
if (path.indexOf(req.path) > -1) {
next();
}
...
};
}
from nest.
Definitely the suggestion of @wbhob is needed @kamilmysliwiec
from nest.
Hey @cdiaz,
The idea is very cool !
Do you have some use cases with 'express' without nest ?
from nest.
Hi @thomrick, It's the basic way I do it with express:
let except = function(path, middleware) {
return function(req, res, next) {
if (path.indexOf(req.path) > -1) {
// Exclude
return next()
}
else {
// Apply for all others
return middleware(req, res, next)
}
}
}
app.use(except(['/some', '/another'], authMiddleware()));
I think it can be implemented in Nest, something like this:
builder.apply(authMiddleware)
.forRoutes(UsersController)
.except({
path: ['/some', '/another']
});
from nest.
Hey @cdiaz,
I looked up on the Nest documentation and I found this:
When you pass UsersController in forRoutes method, Nest will setup middleware for each route in controller:
GET: users
GET: users/:id
POST: users
But it is also possible to directly define for which path middleware should be used, just like that:
builder.apply(AuthMiddleware)
.forRoutes({ path: '*', method: RequestMethod.ALL });
It isn't be better than adding new methods ?
Can you try this in your use cases and see if it's cool enough ?
from nest.
@thomrick Assuming my controller has 20 routes and I need to exclude 2, it is better to write only 2 to exclude them instead of write 18 explicitly
from nest.
@cdiaz in fact you make a good point if you write these 20 routes in 1 Controller !!!
But why writing 20 routes in 1 Controller ?
This problem can't be solved be refining architecture / design ?
And so on applying Middlewares on concerned Controllers ?
from nest.
I agree something like that would be ideal, but @kamilmysliwiec already proposed solution.. I guess it's not a major issue at the moment
from nest.
Reiterating the previous comment, can this issue be reopened?
It is a typical case of excluding some route/methods of a Controller from the middleware and there is no easy way around it.
from nest.
Recreated in #790. Please continue all conversation there, and upvote if you need this functionality.
from nest.
Is it still possible exclude methods?
from nest.
This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.
from nest.
Related Issues (20)
- Supply time to TypeOrmLogger.logQuery() HOT 1
- TCP.onStreamRead (node:internal/stream_base_commons:217:20) HOT 1
- RabbitMQ Bug Microservices HOT 1
- nx 18 + nest + webpack + serverless breaking with error src/main.handler is undefined or not exported HOT 1
- NestJS doesn't handle "Operation failed: QueueDeclare" error from amqplib HOT 1
- Problems Encountered with NestJS and pnpm in a Monorepo Setup HOT 1
- grpc microservice stops listening to requests after version 10.3.3 (needs peer dependency) HOT 1
- perf: caching return value for some functions HOT 1
- The request body does not return an object whose value is an array of objects
- Jest spy doesn't work on Microservices Controller (EventPattern) E2E Tests
- Feature Request: Support for Bun.js HOT 2
- Multi-tenant app fail on first non durable tree request HOT 2
- Kafka Microservice Error When Consumer Has Not Joined the Consumer Group
- LoggerService transforms the instance of Error when controller throws an Error HOT 3
- Easy way to compose ORed validators HOT 1
- Not sure if it is bug or feature request, nest middleware in jest runs before any other express middleware HOT 2
- Devtools with microservices: Error: listen EADDRINUSE: address already in use :::8000 HOT 4
- Hooks in global module which imported more than twice might called multiple times HOT 2
- Overide providers from imported module (not in testing context) HOT 5
- Nest crash when RouteConstraints is used without app versioning enabled HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nest.