如何避免 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/login
或 PUT /v1/user/login
请求时,Express 将它们分别路由为 GET /v1/user/:id
和 PUT /v1/user/:id
,而不是抛出 404我希望如此。
我认为 Express 将路由的 login
部分解释为这些路由中 :id
参数的有效值。
我怎样才能避免这种情况?
GET /v1/user/login
和 PUT /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 值范围,我们避免了误解。
我正在使用 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/login
或 PUT /v1/user/login
请求时,Express 将它们分别路由为 GET /v1/user/:id
和 PUT /v1/user/:id
,而不是抛出 404我希望如此。
我认为 Express 将路由的 login
部分解释为这些路由中 :id
参数的有效值。
我怎样才能避免这种情况?
GET /v1/user/login
和 PUT /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 值范围,我们避免了误解。