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