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

作者站长头像
站长
· 阅读数 5

通过自定义中间件拿到请求参数的用户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

打印的结果是使用node更改req的参数,为什么多了一个中间件就拿不到了?想请问下为什么多了个中间件之后就传不过来了

回复
1个回答
avatar
test
2024-06-25

multer源码:single function:answer image_makeMiddleware function:answer imagemakeMiddleware function:answer image所以在upload.single('avatar')运行之前放入到body中的任何内容都会在这里被清空.解决办法的话,我觉得可以在single和controller中间再跑一个中间件,这个中间件重新解析token,然后把你需要的数据放到body里面。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容