Skip to content
← Back to rules

oxc/no-async-endpoint-handlers 可疑

它的作用

禁止将 async 函数用作 Express 端点处理程序。

为什么这是不好的?

在 v5 之前,Express 不会自动通过应用程序的错误处理程序来处理处理函数中产生的 Promise 拒绝。你必须显式地将被拒绝的 Promise 传递给 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);
});

如果没有这样做,你的服务器将会因未处理的 Promise 拒绝而崩溃。

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();
// 不是 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: []

允许为异步的函数名称数组。

如何使用

要通过配置文件或 CLI 启用 此规则,可以使用:

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

参考资料