Node Multer 设置文件名时的错误处理

问题描述 投票:0回答:1

我已将 multer 配置为使用表单数据中的自定义字段来保存上传的文件名。 但是,如果请求中不存在该数据,我的应用程序将引发错误并崩溃。 参考 multer 文档,他们声称“遇到错误时,Multer 会将错误委托给 Express。您可以使用标准 Express 方式显示漂亮的错误页面。” 这是正常的吗?我应该自己使用中间件功能(为了能够捕获错误)? 或者我错过了什么?

const multerStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    let path = `uploads/${req.body.name}`;
    fs.mkdirsSync(path);
    cb(null, path);
  },
  filename: (req, file, cb) => {
    const ext = file.mimetype.split('/')[1];
    cb(null, `${req.body.customField.toUpperCase()}.${ext}`);
  },
});

const upload = multer({
  storage: multerStorage,
});

app.post('/', upload.single('photo'), (req, res, next) => {
  console.log(req.file);
  console.log(req.body);
  res.status(201).json({
    status: 'Sucess',
  });
});

我尝试定义一个全局错误处理中间件,但 multer 配置中发生的错误不会传递给它。

node.js express multer
1个回答
0
投票

根据您提供的代码,您似乎已正确配置 multer 以使用表单数据中的自定义字段来保存上传的文件名。但是,如果请求中不存在该自定义字段,multer 会将错误委托给 Express,您可以使用标准 Express 错误处理机制来处理它。

在代码中,您可以通过在 multer 中间件之后添加错误处理中间件函数来捕获错误。如果文件上传过程中发生错误,将会调用该中间件函数。以下是如何处理错误的示例:

app.post('/', upload.single('photo'), (req, res, next) => {
  // Handle successful file upload
  console.log(req.file);
  console.log(req.body);
  res.status(201).json({
    status: 'Success',
  });
});

// Error handling middleware
app.use((err, req, res, next) => {
  // Handle multer errors
  if (err instanceof multer.MulterError) {
    // Display a nice error page or send an error response
    res.status(400).json({
      error: 'File upload error',
    });
  } else {
    // Pass the error to the next error handling middleware
    next(err);
  }
});

通过添加此错误处理中间件,您可以捕获任何 multer 错误并进行适当的处理。

© www.soinside.com 2019 - 2024. All rights reserved.