首页 > 解决方案 > 在 multer 的 diskStorage 函数中获取 `req.params`

问题描述

全部:

第一次使用 Koa 和 multer。我已经掌握了文件上传基础知识,但我似乎无法管理这个特定的用例:

editUser设置了路由,userIdctx.params识别正在编辑的用户。假设我要上传用户头像图片并将其存储在 中uploads/:userId/,我将如何将其传递userId给 multer?到目前为止,我尝试了以下方法并没有成功:

这是我的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);

我不确定这是否真的是最好的方法,或者是否有更简单的方法来做到这一点。任何帮助将不胜感激!

标签: node.jsexpressmongoosemulterkoa

解决方案


推荐阅读