我正在使用Express构建RESTful API。我有几个模块,它们组合在Router
中,由应用程序加载,如下所示:
./用户/ 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
参数的有效值。
我该如何避免这种情况?
答案 0 :(得分:0)
您的' / v1 / user /:id'处理GET /v1/user/login
和PUT /v1/user/login
的原因您还没有为'/login'
设置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;
答案 1 :(得分:0)
通过使路线规范明确无误,可以实现所需的结果:
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的可接受值范围,我们可以避免误解。