使用node更改req的参数,为什么多了一个中间件就拿不到了?-灵析社区

无心插柳柳成萌

通过自定义中间件拿到请求参数的用户id const authentication = (req, res, next) => { if (excludeUrl.includes(req.url)) { next() return } const token = req.headers['authorization']?.split(' ')[1] if (token) { const payload = JWT.verify(token) if (payload) { // 重新计算token过期时间 const { username, id } = payload const newToken = JWT.generate({ username, id }, '1h') res.header('Authorization', newToken) req.body = { ...req.body, id }//这里把id放到req.body里面 next() return } // 否则token过期 则返回401 res.status(401).send(sendData(false, '登录超时,请重新登陆')) return } next() } app.js app.use(authentication) app.use('/', indexRouter) app.use('/users', usersRouter) userRouter var express = require('express') var router = express.Router() const userController = require('../controllers/users') const multer = require('multer') const upload = multer({ dest: 'public/avatars/' }) router.get('/get-userinfo', userController.getUserInfo) router.post( '/update-avatar', upload.single('avatar'), userController.updateAvatar ) module.exports = router userController const userServices = require('../services/users') const userController = { getUserInfo: async (req, res) => { console.log('🚀 getUserInfo: req:', JSON.stringify(req.body)) }, updateAvatar: async (req, res) => { console.log('🚀 updateAvatar: req.body:', JSON.stringify(req.body)) }, } module.exports = userController 打印的结果是 ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241128/73ed49a722817a0b7094d57eb1a7b41c.png) 想请问下为什么多了个中间件之后就传不过来了

阅读量:13

点赞量:0

问AI
multer源码: single function: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241128/ca30b8c3dc65e6858ecb3ef41fbee5d4.png) _makeMiddleware function: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241128/ea26b9df4dbe9078a951f88b16fe22d2.png) makeMiddleware function: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241128/0bb111ab40ad2e2edc29718186758d4d.png) 所以在"upload.single('avatar')"运行之前放入到body中的任何内容都会在这里被清空. 解决办法的话,我觉得可以在single和controller中间再跑一个中间件,这个中间件重新解析token,然后把你需要的数据放到body里面。