输入验证,清理和服务层

时间:2013-11-24 15:51:45

标签: node.js validation express sanitization

我正在努力让我的控制器操作尽可能轻量级,所以我正在实现服务层。现在我一直坚持验证和消毒。我知道验证应该在服务层完成但是消毒呢?当有验证错误时,我想用输入数据重新渲染。

//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',清理并验证它,然后仅回退验证错误。如果存在验证错误,则在渲染视图之前在控制器中清理它们。
  2. 与第一个相同,但我们会推迟验证错误和清理字段。

2 个答案:

答案 0 :(得分:5)

如果你使用Express,一个有趣的选择是:

  • 使用express-validator创建中间件并将其用作验证层,该node-validator基于{{3}}。 例如(请参阅所有验证/清理选项的node-validator文档):

    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();
      }
    
    }
    
  • 然后,在您的控制器中,只需获取经过验证的请求参数并运行注册逻辑(您的register函数调用和响应呈现),

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

答案 1 :(得分:2)

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

但是,如果它是一个大型(读取:长寿命)项目,那么:

如果“清理”是指HTTP / HTML清理(或输入或显示消息),则属于控制器。可以这样考虑:控制器可能不是您将输入传递到服务层的唯一位置。将来您可能拥有该服务的API访问权限。或者测试驱动程序可以直接调用它,而无需通过HTTP。所以HTTP / HTML只是传输,因此特定于它的逻辑应该在服务之外。

但是,如果“清理”是指业务逻辑清理(例如:您不允许不存在的国家/地区代码),那么无论如何都应该在服务中,原因完全一样。< / p>

相关问题