如何避免 ExpressJS 误解路由?

How can I avoid ExpressJS misinterpreting routes?

我正在使用 Express 构建 RESTful API。我有几个模块,它们组合在一个 Router 中,它是由应用程序加载的,如下所示:

./user/User.js:

var router = express.Router();

router.post('/login', variousMiddleware, login);
router.get('/:id', variousMiddleware, getUserDetails);
router.put('/:id', variousMiddleware, updateUser);

module.exports = router;

./app.js:

var app = express();

var routes = express.Router();
var User = require("./user/User.js");

routes.use('/user', User);

app.use('/v1/', routes);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers
...

因此,当我执行 POST /v1/user/login 请求或 GET /v1/nonexisting/randomness 时,一切正常。

但是,当我执行 GET /v1/user/loginPUT /v1/user/login 请求时,Express 将它们分别路由为 GET /v1/user/:idPUT /v1/user/:id,而不是抛出 404我希望如此。

我认为 Express 将路由的 login 部分解释为这些路由中 :id 参数的有效值。

我怎样才能避免这种情况?

GET /v1/user/loginPUT /v1/user/login 由您的“/v1/user/:id”路由处理的原因是您没有为 [=14 设置 PUT 或 GET 处理程序=].您只设置了 POST 处理程序。

如果将其更改为:

var router = express.Router();

router.post('/login', variousMiddleware, login);
router.get('/login', variousMiddleware, login);
router.put('/login', variousMiddleware, login);
router.get('/:id', variousMiddleware, getUserDetails);
router.put('/:id', variousMiddleware, updateUser);

module.exports = router;

然后您将能够处理 GET 和 PUT 请求。

另一种选择是将您的“/:id”路由更改为专门用于处理您的 RESTful 操作的内容。类似于:

var router = express.Router();

router.post('/login', variousMiddleware, login);
router.get('/data/:id', variousMiddleware, getUserDetails);
router.put('/data/:id', variousMiddleware, updateUser);

module.exports = router;

通过使路由规范明确,可以实现所需的结果:

var router = express.Router();

router.post('/login', variousMiddleware, login);
router.get('/:id([a-f0-9]+)', variousMiddleware, getUserDetails);
router.put('/:id([a-f0-9]+)', variousMiddleware, updateUser);

module.exports = router;

通过定义可接受的 ID 值范围,我们避免了误解。