我可以覆盖 Express 中的路线吗?

Can I override a route in Express?

如果我这样做:

app.get('/test', (req, res) => {
 res.send('First');
});

app.get('/test', (req, res) => {
 res.send('Second');
});

第一个调用有效,第二个 get 调用不会覆盖第一个。有什么好的方法可以改变吗?

基本上我正在开发一个 Swagger 应用程序,它可以点击多个 APIs。我从 https://github.com/thanhson1085/swagger-combined 分叉出来。该应用程序知道 API A 是否命中 /user 它会将来自 /user 的任何调用代理到适当的位置。现在,该应用会列出来自您加载的 API 的所有 API 调用。这意味着如果 API A 和 API B 具有相同的端点 /user,我将只代理到第一个 API 在我的应用程序中注册了端点。

Express 不允许覆盖路线。但是您应该能够使用一个并决定在哪里代理这些调用。

app.get('/test', (req, res) => {
  if(req.isFirst()){
    res.send('First');
  }
  if(req.isSecond()){
    res.send('Second');
  }
});

最好将这些 api 放在单独的端点中,例如 /api1/user/api2/user/

您基本上可以将 Express Router 传递到另一个 Express Router。

let api1Router = express.Router()
rootRouter.use('/api1', api1Router)

希望对您有所帮助。

我正在创建一个当前使用 express 的框架,其中一部分是具有默认路由。 但有时我也需要替换默认路由。 事实证明,这并不难做到,只需将默认路由移到最后,然后,如果其他任何东西被击中,就会使用它来代替。

const router = require('express').Router();
// default rout
router.all('/:path(\d+|\w+)?', (req, res, next) => {
}
// Route I want to be used first
router.get('/list', (req, res, next) => {
}
// move default route to end of stack
const stack = router.stack;
for(let i = 0; i < stack.length; i++) {
  if(i < stack.length -1 && stack[i].regexp.toString() === '/^(?:\/(\d+|\w+))?\/?$/i' && stack[i].route.methods._all) {
    stack.push(stack.splice(i, 1)[0]);
  }
}