inputvalidation,消毒和服务层

我试图保持我的控制器操作尽可能轻量级,所以我正在实现服务层。 现在我已经通过validation和消毒。 我知道validation应该在服务层完成,但是如何进行消毒呢? 当有validation错误时,我想重新渲染input数据。

//userService.js function function register(data, callback) { if (!data) { return callback(new Error('Here some error...')); } /* Sanitize and validate the data */ /* Method #1 */ //If not valid then call back with validationErrors if (notValid) { return callback({ validationErrors: { 'username': 'Username is already in use.', 'email': 'Invalid characters.', } }); } /* Method #2 */ if (notValid) { return callback({ fields: { //We put here a sanitized fields }, validationErrors: { 'username': 'Username is already in use.', 'email': 'Invalid characters.', } }); } }; //userController.js function // GET/POST: /register function registerAction(request, response, next) { if (request.method === 'POST') { var registerData = { username: request.body['username'], password: request.body['password'], email: request.body['email'], firstName: request.body['firstName'], lastName: request.body['lastName'], }; register(registerData, function(error, someDataIfSucceed) { if (error) { //Re-post the data so the user wont have to fill the form again //Sanitize registerData variable here. return response.render('register', { error: error, validationErrors: error.validationErrors }); }; //User registered succesfully. return response.render('registerSuccess'); }); return; } return response.render('register'); } 

我看到有2个选项。

  1. 用原始POST数据调用服务函数“register”,清理并validation它,然后仅推回validation错误。 如果存在validation错误,则在渲染视图之前在控制器中清理它们。
  2. 与第一个一样,但我们推回validation错误和消毒领域。

如果您使用Express,一个有趣的select是:

  • 创build一个中间件并将其用作validation层,使用基于节点validation器的 express -validator 。 例如(请参阅所有validation/清理选项的节点validation器文档):

     exports.validate = function(req, res, next) { req.assert('username').notEmpty(); req.assert('password').notEmpty(); req.assert('email').isEmail(); req.assert('firstName').len(2, 20).xss(); req.assert('lastName').len(2, 20).xss(); var errors = req.validationErrors(true); if (errors){ res.status(400).json({ status: 'ko', errors: errors }); } else { next(); } } 
  • 然后,在您的控制器中,只需获取已validation的请求参数并运行注册逻辑(您的register函数调用和响应呈现),

恕我直言,这样你可以保持你的代码更干净和解耦。

如果这是一个小项目,不要打扰,只要做一些有效的工作。

但是,如果它是一个很大的项目(阅读:长期),那么:

如果通过“消毒”指的是HTTP / HTML消毒(或input或显示消息),则属于控制器。 这样想一下:控制器可能不是唯一将input传递到服务层的地方。 将来你可能有API访问服务。 或者testing驱动程序可以直接调用它,而不需要通过HTTP。 所以HTTP / HTML就是运输工具,因为它的特定逻辑应该在服务之外。

但是,如果“消毒”指的是商业逻辑消毒(例如:您不允许存在不存在的国家代码),那么出于完全相同的原因,所有这些都应该在服务中。

Interesting Posts