通过自定义中间件拿到请求参数的用户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
打印的结果是
想请问下为什么多了个中间件之后就传不过来了
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);
multer源码:
single function:
_makeMiddleware function:
makeMiddleware function:
所以在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++中,您不能使用临时的地址,并且临时的时间不会超过它出现在其中的表达式。 临时工在铁锈中生活多长时间?而且由于只是一个借方,那么字符串的所有者是谁呢?
考虑: 为什么改变的值会改变的值?