您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型
Posted
技术标签:
【中文标题】您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型【英文标题】:How do you handle form validation, especially with nested models, in Node.js + Express + Mongoose + Jade 【发布时间】:2011-11-27 20:54:19 【问题描述】:您如何使用 Express 和 Mongoose 处理表单验证?您使用的是自定义方法、某些插件还是默认的错误数组?
虽然我可能会看到使用默认错误数组进行一些非常简单的验证,但这种方法似乎在嵌套模型的场景中崩溃了。
【问题讨论】:
【参考方案1】:我个人使用node-validator 来检查用户的所有输入字段是否正确,然后再将其呈现给Mongoose。
Node-validator 也很适合创建所有错误的列表,然后可以呈现给用户。
【讨论】:
我没看到,谢谢。我不喜欢验证如何与路由/控制器逻辑如此紧密地联系在一起。看起来你最终会重复自己。 您希望在哪里处理验证?控制器/路由是正确的位置,因为那是数据进入系统的“入口点”。您可以将其卸载到模型中,但模型担心数据持久性/检索。控制器/路由是最好的地方。 在大多数领域驱动设计中,模型关注业务逻辑、数据完整性和规则验证,而其他参与者(甚至其自身)关注数据持久性/检索。我意识到模型处理数据部分,但我相信它们也应该处理验证。我不会真的认为它“卸载”给他们。 我喜欢这个,但是在将其发送到服务器之前是否应该包括客户端验证? 恕我直言,在每个客户端、控制器和数据层中进行验证!【参考方案2】:Mongoose 有验证中间件。您可以单独为模式项定义验证函数。也可以验证嵌套项目。此外,您可以定义异步验证。欲了解更多信息,请查看mongoose page。
var mongoose = require('mongoose'),
schema = mongoose.Schema,
accountSchema = new schema(
accountID: type: Number, validate: [
function(v)
return (v !== null);
, 'accountID must be entered!'
]
),
personSchema = new schema(
name: type: String, validate: [
function(v)
return v.length < 20;
, 'name must be max 20 characters!']
,
age: Number,
account: [accountSchema]
),
connection = mongoose.createConnection('mongodb://127.0.0.1/test');
personModel = connection.model('person', personSchema),
accountModel = connection.model('account', accountSchema);
...
var person = new personModel(
name: req.body.person.name,
age: req.body.person.age,
account: new accountModel( accountID: req.body.person.account )
);
person.save(function(err)
if(err)
console.log(err);
req.flash('error', err);
res.render('view');
...
);
【讨论】:
是的,但是如果你喜欢 PersonSchema = new Schema( account : AccountSchema ); AccountSchema 有验证的地方,错误不会冒泡。 Stephen:我猜Backbone的模型验证可以用在客户端。但它可能有点令人困惑,混合的客户端/服务器端代码。 Dailyjs wrote about it 呃,对不起,我的意思是 PersonSchema = new Schema( accounts : [AccountSchema] ),而不是其他方式(这是不可能的 - 我的错误)。当我有一个集合时,我没有得到错误冒泡。我会再试一次,看看它是否有效。谢谢。 我错过了你最初所做的,这就是我最终的结果(谢谢)。【参考方案3】:我个人使用express-form 中间件进行验证;它还具有过滤功能。它基于节点验证器,但对 express 有额外的好处。它向请求对象添加一个属性,指示它是否有效并返回一个错误数组。
如果您使用的是 express,我会使用它。
【讨论】:
Chaz,你有什么好的方法可以使用 express-form 的清理方法访问嵌套数据吗?以上是关于您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型的主要内容,如果未能解决你的问题,请参考以下文章
如何让 twitter 引导模式在 node js express js 中工作?
简单的游戏循环 Socket.io + Node.js + Express
Node.js + Express 接口请求(GETPOSTPUT)事例