我希望在/api路径下有不同的路由和不同的中间件处理程序.具体地说,不同的API路由应该允许不同的身份验证方式.

我以为我可以用不同的中间件在两个不同的Router下嵌套不同的API路由:

const express = require("express");

const app = express();
const port = 4000;

const one = express.Router();
one.use((req, res, next) => {
  console.log("one");
  next();
});
one.get("/api/one", (req, res) => {
  console.log("/api/one");
  res.send("one");
});

// ---

const two = express.Router();
two.use((req, res, next) => {
  console.log("two");
  next();
});
two.get("/api/two", (req, res) => {
  console.log("/api/two");
  res.send("two");
});

// ---

app.get("/", (req, res) => {
  res.send("Hello World!");
});
app.use(one);
app.use(two);

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

我预计导航到/api/one时会记录one,导航到/api/two时会记录two,但是导航到/api/two时会运行both个中间件:

Example app listening on port 4000
one
/api/one
one
two
/api/two

有没有办法实现我想要的without for each 单独的API路由列出不同的中间件?

推荐答案

事实证明,简单的答案是否定的.

对于属于同一路径的路由,不能有不同的中间件处理程序.中间件不是用单个Router封装的,因此在同一路径上使用两个不同的Router和不同的中间件将导致第一个路由上的中间件在第二个中定义的路由上运行.

Javascript相关问答推荐

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

yarn安装一个本地npm包,以便本地包使用main项目的node_modules(ckeditor-duplicated-modules错误)

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

当试图显示小部件时,使用者会出现JavaScript错误.

在带有背景图像和圆形的div中添加长方体阴影时的重影线

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

我的角模板订阅后不刷新'

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

material UI按钮组样式props 不反射

覆盖TypeScrip中的Lit-Element子类的属性类型

Eval vs函数()返回语义

如何在Svelte中从一个codec函数中调用error()?

如何使用JS创建一个明暗功能按钮?

Reaction Redux&Quot;在派单错误中检测到状态Mutations

FireBase云函数-函数外部的ENV变量

Docent.cloneNode(TRUE)不克隆用户输入

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

连续添加promise 时,如何在所有promise 都已结算时解除加载覆盖

有角粘桌盒阴影

带元素数组的Mongo聚合