配置Express auth路由后,访问/api/v1/auth路径提示路由不存在?
问题原因与解决办法
问题出在中间件和路由的挂载顺序上:你在app.js里先注册了notFoundMiddleware(404处理中间件),之后才挂载auth和jobs路由。而Express的中间件是按代码顺序依次执行的,所有请求会先经过notFoundMiddleware,直接返回"Route doesn't exist",根本轮不到后面的路由匹配。
修改方案
把路由挂载代码移到404中间件之前,调整后的关键代码如下:
// 先挂载业务路由 app.use('/api/v1/auth', authRouter); app.use('/api/v1/jobs', jobsRouter) // 再注册错误处理中间件 app.use(notFoundMiddleware); app.use(errorHandlerMiddleware);
完整修改后的app.js代码
require('dotenv').config(); require('express-async-errors'); const express = require('express'); const app = express(); //connect to the db // const connectDB = require('./db/connect'); //routers const authRouter = require('./routes/auth') const jobsRouter = require ('./routes/jobs') // error handler const notFoundMiddleware = require('./middleware/not-found'); const errorHandlerMiddleware = require('./middleware/error-handler'); app.use(express.json()); // extra packages // routes app.get('/', (req, res) => { res.send('jobs api'); }); app.get('/auth/register', (req,res)=>{ res.send('This is the bullshit') }); // 路由挂载移到错误中间件之前 app.use('/api/v1/auth', authRouter); app.use('/api/v1/jobs', jobsRouter) // 错误处理中间件放在最后 app.use(notFoundMiddleware); app.use(errorHandlerMiddleware); const port = process.env.PORT || 3000; const start = async () => { try { // await connectDB(process.env.MONGO_URI); app.listen(port, () => console.log(`Server is listening on port ${port}...`) ); } catch (error) { console.log(error); } }; start();
调整后重启服务器,再用POST请求访问localhost:3000/api/v1/auth/register或localhost:3000/api/v1/auth/login就能正常触发控制器里的响应了。
内容的提问来源于stack exchange,提问作者Iriza Peace
相关产品推荐
相关产品推荐

