본문 바로가기
Archive

[3] express 비동기 에러 해들링

by livemehere 2022. 4. 3.

비동기 작업도 자동으로 error 미들웨어로 던지려면?

import "express-async-errors" 이 라이브러리를 받고,import 만해주면 Promise를 반환하는 미들웨어의 에러를 error 미들웨어로 넘깁니다. async 함수로 작성된것은 그냥두면 되지만 promise 로 작성된 비동기작업은 반드시 그 promise를 return 해주어야합니다.

callback은 처리안해줘도 잡아지는 거같음.

import express from "express";
import fs from "fs";
import "express-async-errors";

const app = express();

app.use(express.json());

// 동기작업 에러 처리
app.get("/file1", (req, res, next) => {
  const data = fs.readFileSync("./file1.txt");
});

// 비동기작업 에러 처리 (callback)
app.get("/file2", (req, res, next) => {
  // callback형태의 비동기작업은 err가 callback으로 넘어가기 때문에, 외부에서 에러가 던져지지 않는다. callback 내에서 처리해 주어야한다.
  fs.readFile("./file2.txt");
});

// 비동기작업 에러 처리 (promise)
app.get("/file3", (req, res, next) => {
  return fs.promises.readFile("./file3").then((data) => {
    res.status(200).send(data);
  });
});

// 비동기작업 에러 처리 (promise to next)
app.get("/file4", (req, res, next) => {
  return fs.promises.readFile("./file4");
});

// 비동기작업 에러 처리 (async)
app.get("/file5", async (req, res, next) => {
  const data = await fs.promises.readFile("./file5");
});

// 미들웨어에서 에러가 발생하면 모두 여기로 넘어온다.(미들웨어 내에서 에러처리를 하지 않을때)
app.use((error, req, res, next) => {
  console.log("error");
  res.send({ message: "만능 error 발생!" });
});

app.listen(8080);
반응형