如何避免ExpressJS错误解释路线?

时间:2016-08-12 12:13:14

标签: node.js express url-routing

我正在使用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/loginPUT /v1/user/login请求时,Express会分别将这些请求路由为GET /v1/user/:idPUT /v1/user/:id,而不是像我一样投掷404期待它。

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

我该如何避免这种情况?

2 个答案:

答案 0 :(得分:0)

您的' / v1 / user /:id'处理GET /v1/user/loginPUT /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的可接受值范围,我们可以避免误解。