gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:37:21 24 4
gpt4 key购买 nike

我知道在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com