Skip to content
← Back to rules

oxc/no-async-endpoint-handlers 의심스러움

작동 방식

Express 엔드포인트 핸들러로 async 함수 사용을 금지합니다.

왜 문제일까?

v5 이전 버전의 Express는 핸들러 함수에서 발생하는 프로미스 거부를 애플리케이션 오류 처리기로 자동으로 처리하지 않습니다. 대신, 거부된 프로미스를 next()에 명시적으로 전달해야 합니다.

js
const app = express();
app.get("/", (req, res, next) => {
  new Promise((resolve, reject) => {
    return User.findById(req.params.id);
  })
    .then((user) => res.json(user))
    .catch(next);
});

이 작업이 수행되지 않으면 서버는 처리되지 않은 프로미스 거부로 인해 충돌하게 됩니다.

js
const app = express();
app.get("/", async (req, res) => {
  // User.findById가 거부될 경우 서버가 충돌합니다.
  const user = await User.findById(req.params.id);
  res.json(user);
});

자세한 정보는 Express 오류 처리 가이드를 참고하세요.

예시

이 규칙에 부적절한 코드 예시:

js
const app = express();
app.get("/", async (req, res) => {
  const user = await User.findById(req.params.id);
  res.json(user);
});

const router = express.Router();
router.use(async (req, res, next) => {
  const user = await User.findById(req.params.id);
  req.user = user;
  next();
});

const createUser = async (req, res) => {
  const user = await User.create(req.body);
  res.json(user);
};
app.post("/user", createUser);

// 가져온 비동기 핸들러는 각 파일이 독립적으로 검사되기 때문에 감지되지 않습니다. 이는 규칙을 트리거하지 않지만 여전히 규칙을 위반하며, 서버 충돌을 초래할 것입니다.
const asyncHandler = require("./asyncHandler");
app.get("/async", asyncHandler);

이 규칙에 적절한 코드 예시:

js
const app = express();
// 비동기 아님
app.use((req, res, next) => {
  req.receivedAt = Date.now();
});

app.get("/", (req, res, next) => {
  fs.readFile("/file-does-not-exist", (err, data) => {
    if (err) {
      next(err); // 오류를 Express에 전달합니다.
    } else {
      res.send(data);
    }
  });
});

const asyncHandler = async (req, res) => {
  const user = await User.findById(req.params.id);
  res.json(user);
};
app.get("/user", (req, res, next) => asyncHandler(req, res).catch(next));

구성

이 규칙은 다음 속성을 가지는 구성 객체를 수락합니다:

allowedNames

type: string[]

default: []

비동기로 허용되는 이름들의 배열입니다.

사용 방법

이 규칙을 설정 파일 또는 CLI를 통해 활성화하려면 다음과 같이 사용할 수 있습니다:

json
{
  "rules": {
    "oxc/no-async-endpoint-handlers": "error"
  }
}
bash
oxlint --deny oxc/no-async-endpoint-handlers

참고 자료