我想创建一个Express REST API,并想验证请求参数和请求主体。
我有一个路由器文件来管理所有路由。呼叫localhost:3000/users
时,路由器将转发至
app.use('/users', require(`./routes/users.js`));
在该路由文件中,我将管理所有与用户相关的路由
router.get('/', usersController.getAllUsers);
router.get('/:userId', usersController.getUserById);
router.post('/signup', usersController.signUp);
router.post('/signin', usersController.signIn);
router.post('/signout', authenticationCheck, usersController.signOut);
router.put('/:userId', authenticationCheck, authorizationCheck, usersController.updateUserById);
router.delete('/:userId', authenticationCheck, authorizationCheck, usersController.deleteUserById);
如您所见,某些路由具有authenticationCheck
,该路由使用JSON Web令牌处理会话管理。 authorizationCheck
处理权限。
控制器本身将执行真正的逻辑
exports.deleteUserById = async (req, res, next) => {
const { userId } = req.params;
// validate the userID here?
// try to delete the user from the database
// send a response
};
要确保params和body变量具有正确的格式,我想使用express-validator
模块。我的问题是我应该何时验证请求?
我可以先验证
router.delete('/:userId', validation(arguments), authenticationCheck, authorizationCheck, usersController.deleteUserById);
其中validation(arguments)
将使用一些参数进行验证,如果失败则发送400
。这样可以避免不必要的代码执行,但是以前没有进行身份验证或身份验证检查。
我也可以在调用控制器逻辑之前进行验证
router.delete('/:userId', authenticationCheck, authorizationCheck, validation(arguments), usersController.deleteUserById);
首先检查身份验证和授权,但这可能会导致不必要的代码执行。
这两种方法都有一个问题,即验证逻辑在路由文件中处理。您将必须在路由文件中以及随后在控制器文件中同步所需的控制器变量。
最后,我可以先呼叫控制器并立即启动验证。
这里的最佳做法是什么?
答案 0 :(得分:0)
无需进行身份验证和授权验证。这将是不必要的工作,因为如果未授权用户,则不会使用数据,也不需要检查数据。这就是MEAN或Sail等框架的工作方式。 您应该使用第二种解决方案。
有关信息,您可以使用http://expressjs.com/en/4x/api.html#router
对路线进行分组如有必要,您也可以使用http://expressjs.com/en/4x/api.html#router.param
fit_resample