表示默认错误处理程序不发送响应

Express default error handler not sending response

提问人:RRR 提问时间:10/26/2023 更新时间:10/27/2023 访问量:33

问:

我正在使用卸载图像,然后使用压缩图像。上传图像时,我正在检查文件类型,如果不是图像,则将 err 抛给全局 err 处理程序以跳过图像压缩。抛出的 err 由全局 err 处理程序处理,但无法从处理程序将响应发送到前端。尝试了所有资源,但似乎没有任何效果!multergm

路由:

router.post(
  "/updateProfile",
  auth,
  upload(uploadUser.single("file")),
  compressImages,
  (req, res) => {}

上传中间件:

const imageFilter = (req, file, cb) => {
  const allowedExtensions = /(jpg|jpeg|png)$/i;
  const allowedMimetypes = /(image\/jpeg|image\/png)$/i;

  if (
    allowedExtensions.test(path.extname(file.originalname)) &&
    allowedMimetypes.test(file.mimetype)
  ) {
    cb(null, true);
  } else {
    cb(new CustomError("Invalid file type, only .jpeg/.png allowed!", 415));
  }
};

const upload = (uploadType) => (req, res, next) => {
  uploadType(req, res, (err) => {
    if (err) {
      return next(err);
    }
    return next();
  });
};

全局错误处理程序:

const errorHandler = (err, req, res, next) => {
  if (res.headersSent) {
    console.log("headers sent");
    return next(err);
  }
  if (err) {
    res.setHeader("Content-Type", "application/json");
    return res
      .status(err.statusCode || 500)
      .json(new ApiResponse(err.message || "Something went wrong!", null));
  }
  return next(err);
};
app.use(errorHandler);
节点 .js 表示 错误处理 自定义错误处理

评论

0赞 Ameer Hamza 10/27/2023
请您分享您的中间配置的顺序吗?即在索引文件或应用程序文件中

答:

0赞 eekinci 10/27/2023 #1

在 中,仅当存在时才发送一个 respone,让它环绕其余部分:errorHandlererr

const errorHandler = (err, req, res, next) => {
  if (err) {
    if (res.headersSent) {
      console.log("headers sent");
      return next(err);
    }
    res.setHeader("Content-Type", "application/json");
    return res
      .status(err.statusCode || 500)
      .json(new ApiResponse(err.message || "RRR, something went wrong!", null));
  }
  return next(err);
};