当前位置: 首页 > 知识库问答 >
问题:

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

南门茂才
2023-11-02

通过自定义中间件拿到请求参数的用户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
想请问下为什么多了个中间件之后就传不过来了

共有2个答案

容柏
2023-11-02

authentication 中间件,把用户ID保存在 req 的其他属性上,比如 req.userId:

const authentication = (req, res, next) => {  // ... 其他代码  req.userId = payload.id;  next();}

然后,建一个新的中间件,在multer 之后运行,把 req.userId 加到 req.body:

const addUserToBody = (req, res, next) => {  if (req.userId) {    req.body.id = req.userId;  }  next();}

最后,在路由里用这两个中间件:

router.post(  '/update-avatar',  upload.single('avatar'),  addUserToBody,  userController.updateAvatar);
司空海荣
2023-11-02

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

 类似资料:
  • 本文向大家介绍为什么用relu就不用sigmoid了相关面试题,主要包含被问及为什么用relu就不用sigmoid了时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Sigmoid的导数只有在0的附近时有比较好的激活性,在正负饱和区域的梯度都接近0,会导致梯度弥散。而relu函数在大于0的部分梯度为常数,不会产生梯度弥散现象。Relu函数在负半区导数为0,也就是说这个神经元不会经历训练,就是

  • 问题内容: 我发布了Java TableModelListener和Live FeedListener的答案?,但我收到– kleopatra的评论 可以告诉我什么是更改通知者,接收更改事件,可能发生的情况,她真正的意思,因为当我尝试所有我知道我只从非常快的循环中收到RepaintManager异常的事情时, 我再也没有例外 我将其乘以50 x 1000矩阵, 使用prepareRenderer(

  • 问题内容: 在以下Express函数中: 什么是和?它们代表什么,它们是什么意思,它们是做什么的? 谢谢! 问题答案: 是一个对象,其中包含有关引发事件的HTTP请求的信息。作为对的响应,您可以用于发送回所需的HTTP响应。 这些参数可以命名为任何东西。您可以将代码更改为以下内容: 编辑: 说您有这种方法: 该请求将是一个具有以下属性的对象(仅举几例): ,这将是触发此特定操作的时间 ,在这种情况

  • 当本地起了2个node express服务,用nginx配置proxy_pass时候。只能代理成功第一个,第二个代理不成功,什么原因。 配置如:

  • 来自C++,我很惊讶这段代码在Rust中是有效的: 在C++中,您不能使用临时的地址,并且临时的时间不会超过它出现在其中的表达式。 临时工在铁锈中生活多长时间?而且由于只是一个借方,那么字符串的所有者是谁呢?

  • 考虑: 为什么改变的值会改变的值?