您如何在 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 中加载 html 页面

Node.js + Express 接口请求(GETPOSTPUT)事例

如何在 Node/Express 应用程序中处理 api 版本

如何在 Node.js / Express.js 中将中间件放在它自己的文件中