[英]NodeJS How can i make my route out of middleware
我的 API 上有一些路由。 并有一个中间件。 它创建不记名令牌并检查它。 但是我希望我的一些路由不要进入该中间件,这样我就可以在没有令牌的情况下访问。 我怎样才能做到? 我的中间件:
app.use(async (req, res, next) => {
if (
req.path === "/api/v1/collection/byhome" || // I dont want that part.
req.path === "/api/v1/user/login" // Its working but its not looks like best solution.
) {
next();
} else {
const bearerHeader = req.header("authorization");
if (typeof bearerHeader !== "undefined") {
const bearer = bearerHeader.split(" ");
const bearerToken = bearer[1];
req.token = bearerToken;
jwt.verify(req.token, process.env.SECRETKEY, async (err, authData) => {
if (err) {
res.sendStatus(401);
} else {
next();
}
});
} else {
res.statusCode = 400;
const Response = {
message: "Invalid Token",
StatusCode: res.statusCode,
};
res.json(Response);
}
}
});
我的路线:
app.get(
`/api/${version}/article/bycollection/:id`,
ArticleRoute.getbycollection
);
您这样做的方式是正确的,您可以通过制作一个包含您想要超出中间件范围的所有中间件的数组来使您的代码更具可读性
const whiteListEndpoints = ["/api/v1/this", "/api/v1/this1", "/api/v1/this2"]
然后
// your middleware
app.use((req, res,next) => {
//if the path was in the whitelist just call next function
if(whiteListEndpoints.includes(req.url)) return next()
// let the middlware do it's job
})
或者您可以更改您的快递use
顺序
const firstRoute = app.use("/no_middleware", router);
app.use((req, res, next) => {}) // your middleware
const secondRoute = app.use("/with_middleware", router);
这里第一个路由器不会使用中间件,因为它还没有被调用。
您可以创建一个路由express.Router()
并将其设置为path
,该路由器具有所有身份验证,然后创建第二个express.Router()
并且没有身份验证。
var router = express.Router();
// your code for API auth...
router.get('/api/v1/collection/byhome',myMiddleware, (req, res, next) => {
res.send('Hey There');
})
app.use('/api', router);
var routerGuest = express.Router();
//
routerGuest.get('/', (req, res, next) => {
res.send('Hey There');
})
app.use('/guest', routerGuest)
对于身份验证,我建议制作一个单独的中间件,然后将其传递给我们的路由
function myMiddleware(req, res, next){
const bearerHeader = req.header("authorization");
if (typeof bearerHeader !== "undefined") {
const bearer = bearerHeader.split(" ");
const bearerToken = bearer[1];
req.token = bearerToken;
jwt.verify(req.token, process.env.SECRETKEY, async (err, authData) => {
if (err) {
res.sendStatus(401);
} else {
next();
}
});
} else {
res.statusCode = 400;
const Response = {
message: "Invalid Token",
StatusCode: res.statusCode,
};
res.json(Response);
}
}
}
我想有了这个你可能会有一些想法:)
您可以使用Express.Router
来实现所需的结果。 使用快速路由器,您可以区分路由并为每个路由器使用不同的中间件。
请按照以下步骤操作:
middlewares/private.authenticate.js
function auth(req, res, next) {
// do auth stuff...
next();
}
routes/private/index.js
// private route handler
import { Router } from "express";
import auth from "./middlewares/private.authenticate.js";
const router = Router();
router.use(auth); // use auth middleware
router.route("/")
.get()
.put()
export default router;
routes/public/index.js
import { Router } from "express";
const router = Router();
router.route("/")
.get()
.put()
export default router;
import express from "express";
const app = express();
import PublicRoutes from "./routes/public";
import PrivateRoutes from "./routes/private";
// public routes path
app.use("/api/public", PublicRoutes);
// private routes path
app.use("/api/private", PrivateRoutes);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.