使用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
打印的结果是想请问下为什么多了个中间件之后就传不过来了
回复
1个回答
test
2024-06-25
multer源码:single function:_makeMiddleware function:makeMiddleware function:所以在upload.single('avatar')
运行之前放入到body中的任何内容都会在这里被清空.解决办法的话,我觉得可以在single和controller中间再跑一个中间件,这个中间件重新解析token,然后把你需要的数据放到body里面。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容