Express项目中app.use(morgan('dev'))写在server.js不生效问题咨询
问题原因
Express 中间件严格按照注册顺序执行,当某个中间件或路由处理完请求并返回响应后,后续注册的中间件将不会被触发。
你当前的代码注册顺序存在问题:
- 首先在
app.js中已经依次注册了express.json解析中间件、接口路由、静态资源服务中间件,所有用户请求都会被这几部分提前处理完成并返回响应 - 之后你才在
server.js中注册morgan中间件,此时没有请求会流转到morgan中执行,因此不会打印日志,也不会抛出报错。
解决方法
推荐采用最符合Express项目规范的方案:将morgan中间件的注册逻辑移到app.js中,且放在所有处理业务请求的中间件、路由之前即可。
修改后的app.js代码示例:
const express = require("express"); const dotenv = require("dotenv"); const morgan = require("morgan"); // 引入morgan const movieRouter = require("./routes/movieRoutes"); const userRouter = require("./routes/userRoutes"); const app = express(); dotenv.config({ path: "./config.env" }); // 优先注册morgan日志中间件 app.use(morgan("dev")); app.use(express.json()); //Mounting routes app.use("/kramank-api/v1/movies", movieRouter); app.use("/kramank-api/v1/users", userRouter); app.use(express.static("./")); module.exports = app;
同时删除server.js中app.use(morgan("dev"))的冗余代码即可。
如果你确实需要将morgan注册逻辑放在server.js中,只需要调整注册顺序:将app.js中路由、静态资源的注册逻辑移到server.js的morgan注册之后即可,不过这种方案会拆分路由注册逻辑,不利于项目维护,不推荐使用。
内容的提问来源于stack exchange,提问作者Abhishek C. Gidde
相关产品推荐
相关产品推荐

