Skip to content
← Back to rules

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

参照