我使用Auth0快速启动在Express中实现了受保护的API路由。受保护的路由由Auth0提供的名为checkJwt
的中间件函数处理。只要调用其中一个GET方法,它就会运行。如果我在server.js
中管理所有路由,则此过程运行良好。
如何分离路由处理,同时保留受保护的API路由
server.js
具有受保护路由的工作代码。
import colors from 'colors'
import cors from 'cors'
import express from 'express'
import morgan from 'morgan'
import dotenv from 'dotenv'
import connectDB from './db.js'
import checkJwt from './middleware/auth.middleware.js'
import { getStudents, getStudent } from './controllers/students.controller.js'
dotenv.config()
connectDB()
export const app = express()
app.use(cors())
app.use(express.json({ limit: '50mb' }))
if (process.env.NODE_ENV === 'development') {
app.use(morgan('dev'))
}
//handle routing internally
app.get('/api/students/:id', checkJwt, getStudent)
app.get('/api/students', checkJwt, getStudents)
const PORT = process.env.PORT || 6000
app.listen(PORT, () =>
console.log(
`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold
)
)
随着代码的增长,我想放弃路由处理。一旦我把路由分开,我就不知道把checkJwt
放在哪里了。
server.js
所需的代码结构为:
import colors from 'colors'
import cors from 'cors'
import express from 'express'
import morgan from 'morgan'
import dotenv from 'dotenv'
import connectDB from './db.js'
import studentsRouter from './routes/students.routes.js'
dotenv.config()
connectDB()
const app = express()
app.use(cors())
app.use(express.json({ limit: '50mb' }))
if (process.env.NODE_ENV === 'development') {
app.use(morgan('dev'))
}
// handle routing externally
const apiRouter = express.Router()
app.use('/api', apiRouter)
apiRouter.use('/students', studentsRouter)
const PORT = process.env.PORT || 6000
app.listen(PORT, () =>
console.log(
`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold
)
)
路由在students.routes.js
路由处理程序中实现。
import express from 'express'
import { getStudent, getStudents } from '../controllers/students.controller.js'
const router = express.Router()
// where can I implement checkJwt?
router.route('/').get(getStudents)
router.route('/:id').get(getStudent)
export default router
是否可以通过移动路由来简化代码,同时仍然保护我的路由?
您可以在路由器中使用任何类似的中间件:
const router = express.Router();
router.route('/').get([checkJwt, secondMiddleware, ...] , getStudents);
基于文件:快速路由
您可以提供多个回调函数,这些函数的行为类似于处理请求的中间件。唯一的例外是,这些回调可能会调用next("route"(来绕过剩余的路由回调。您可以使用此机制对路线施加先决条件,然后在没有理由继续使用当前路线的情况下将控制权传递给后续路线。