node.js - 在 multer 的 diskStorage 函数中获取 `req.params`
问题描述
全部:
第一次使用 Koa 和 multer。我已经掌握了文件上传基础知识,但我似乎无法管理这个特定的用例:
我editUser
设置了路由,userId
以ctx.params
识别正在编辑的用户。假设我要上传用户头像图片并将其存储在 中uploads/:userId/
,我将如何将其传递userId
给 multer?到目前为止,我尝试了以下方法并没有成功:
- 获取
userId
frommulter.diskStorage({ destination: (req) => {})
:req.params
似乎并不存在,因为它总是返回undefined
。 - Getting
userId
frommulter.diskStorage({ destination: (req) => {} }
:req.body
返回一个带有请求正文的对象,但它不包括通过的userId
asctx.params
。 editUser
在 multer 之前运行该函数并在其中添加/userId
以希望它出现在的参数中。ctx.file
ctx.request.body
multer.diskStorage
req
这是我的editUser
控制器的代码:
const editUser = async (ctx, next) => {
const { id } = ctx.params;
await next();
const user = await User.findByIdAndUpdate(
id,
{ ...ctx.request.body, image: ctx.file.path },
{
new: true,
}
).lean();
if (user) {
ctx.status = 200;
ctx.body = user;
} else {
throw ERROR_MESSAGES.USER.NOT_FOUND;
}
};
这是我的multer.diskStorage()
实现代码:
const storage = multer.diskStorage({
destination: (request, file, callback) => {
const { id } = request.body; // undefined
const { id } = request.params; // undefined
const directory = `public/uploads/${id}/`;
fs.exists(directory, (exists) => {
if (!exists) {
return fs.mkdir(directory, (error) => callback(error, directory));
}
callback(null, directory);
});
},
filename: (request, file, callback) => {
callback(null, file.originalname);
},
});
这是触发上传/编辑的路线:
router.post('/:id', upload.single('image'), editUser);
我不确定这是否真的是最好的方法,或者是否有更简单的方法来做到这一点。任何帮助将不胜感激!
解决方案
推荐阅读
- c++ - QT 5.11.3 - QDomNode:无法打印 dom 元素的值
- javascript - 使用不同文件中的节点模块创建全局变量
- typescript - 类型 'R[P]' 不满足约束 '(...args: any) => any'
- java - 如何从服务器获取会话 cookie 并将其设置到 api 标头中?
- java - 如何在java jframe中嵌入视频
- shopify - 使用 shopify-connector 过滤 shopify 产品
- ios - 如何生成 Xamarin IPA 文件
- report - 如果子报表增加大小,Pentaho 报表设计器会重复细节
- javascript - React Native 应用程序在获取 API 时冻结
- node.js - epmd:仅在文件描述符 6 (0) 上获得部分数据包