javascript - 服务器端在哪里验证用户输入?

标签 javascript node.js validation

我知道在 Web 开发中,用户输入应该在客户端和服务器端进行验证。

我很难弄清楚在哪里验证服务器端的输入。
例如,在请求通过中间件并到达 Controller 之后。在 Controller 中,我有其他模块将接受输入并最终到达目的地然后做出响应。

是否应该在 Controller 中完全完成输入验证,以便将输入放入其他模块时达到预期效果?或者我应该检查接受输入的模块中的输入?或者我应该对 Controller 中的输入进行“浅层”检查(基本原始类型检查等)并在模块本身中保留业务逻辑检查(值是​​正数吗?负数?等等)?

示例代码:
Controller .js

  var mashUp = require('./mashupService');

  var create = function(req, res) {
  var user = req.body.user;
  var imageName = req.body.imageName;
  var description = req.body.description;

  //more validation here? 

  if (!user) {
    return ApiResponse(req, res, new Error('no user'));
  } else if (!imageName) {
    return ApiResponse(req, res, new Error('no image name'));
  } else if (!description) {
    return ApiResponse(req, res, new Error('no description'));
  }

  // continue with business
  mashUp(user, imageName, description, function(err, id) {
    if (err) {
      return ApiResponse(req, res, new Error('mashup error'));
    }
    return ApiResponse(req, res, { id: id });
  }); 
};

`其他模块、库等'

var User = require('./model/user');


function mashUp(user, imageName, desc, callback) {

  //more validation here?

  User.find({ user: user }, function(err, _user) {
    //do stuff


    callback(err, id) ;
  });
}

module.exports = mashUp

最佳答案

当您从不同的 Angular 验证数据时,会有一些差异:

模型验证: 当您有需要应用于数据模型的规则(如 required、min、max、match 等)时,这些规则是使用任何 orm 或 odm 构建的,如果在大多数情况下任何验证失败,则会冒泡到中间件您可以从那里进行处理。

如果您需要实现更复杂的逻辑,您可以选择设置自定义验证器。

这是一个 Moongose 示例:

var UserSchema = new Schema({
    firstName: {
        type: String,
        trim: true,
        default: '',
        validate: [customValidator, 'Please fill in your first name'] 
        // custom validator
    },
    lastName: {
        type: String,
        trim: true,
        default: '',
        validate: [customValidator, 'Please fill in your last name']
        // custom validator
    },
    displayName: {
        type: String,
        trim: true
    },
    email: {
        type: String,
        trim: true,
        unique: true,
        default: '',
        validate: [customValidator, 'Please fill in your email'], 
        // custom validator
        match: [/.+\@.+\..+/, 'Please fill a valid email address'] 
        //match validator
    },
    username: {
        type: String,
        unique: true,
        required: 'Please fill in a username', //required validator
        trim: true
    }
});

如需进一步引用,请查看mongoose验证

业务规则

这更适用于您现在描述的场景,处理可能适用于系统中特定情况或用户历史记录的规则。

我不建议管理 Controller 中的验证,一个竖起大拇指的规则是创建胖模型和瘦 Controller ,你可以用谷歌搜索它,但我随机选择了这个 presentation还有这个article .

据说我更喜欢在 Controller 执行之前在中间件中进行这些验证。

让我们来论证以下案例

when editing an article lets validate that id belong to the user that is requesting to edit

exports.validateArticle = function(req, res, next){
 var userId = req.param('userId'),
     articleId = req.param('articleId');

    // TODO: logic validation
}

然后在 Controller 执行之前连接中间件,例如

app.route('/article').all( rule.validateArticle ).post(controller.editArticle);

这样一来,您就不会通过一堆验证来污染您的 Controller ,而且您还可以将验证从一个 Controller 重用到另一个 Controller 。

顺便说一句,客户端验证是为了用户体验而设计的,但不依赖它们作为系统的正确验证器。

这里只是我的两分钱, 我希望这会有所帮助。

干杯!

关于javascript - 服务器端在哪里验证用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26427054/

相关文章:

node.js - 如何从 Mongoose 查询返回值

javascript - 如何使用 jQuery 验证表单?

javascript - 使用 JavaScript 验证注册

javascript - Onblur 在提交表单时防止 onsubmit

javascript - TypeScript 中的 Import 和 require 有什么不同?

javascript - 将按钮的实例传递给它的 onclick 函数 jquery

javascript - 函数前面的感叹号有什么作用?

javascript - 如何反转 String.fromCharCode?

node.js - PhantomJs 返回未定义的 page.title

javascript - 如何将 Node.js 服务器数据发送到 Javascript 客户端?