oxc/no-async-endpoint-handlers 疑わしい
何を実行するか
async 関数を Express エンドポイントハンドラーとして使用することを禁止します。
なぜ問題なのか
v5 以前の Express では、ハンドラー関数から返されたプロミスの拒否(rejection)をアプリケーションのエラー処理ハンドラーが自動的に処理しません。代わりに、明示的に拒否されたプロミスを 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);
// インポートされた async ハンドラーは、各ファイルが独立してチェックされるため検出されません。このコードはルールをトリガーしませんが、依然としてルール違反であり、_サーバーのクラッシュ_ を引き起こします。
const asyncHandler = require("./asyncHandler");
app.get("/async", asyncHandler);このルールに対して正しいコードの例:
js
const app = express();
// async ではない
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: []
async と許可される名前の配列。
使用方法
設定ファイルまたは CLI でこのルールを有効化するには、以下のように使用できます:
json
{
"rules": {
"oxc/no-async-endpoint-handlers": "error"
}
}bash
oxlint --deny oxc/no-async-endpoint-handlers