【问题标题】:How do you handle form validation, especially with nested models, in Node.js + Express + Mongoose + Jade您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型
【发布时间】:2011-11-27 20:54:19
【问题描述】:

您如何使用 Express 和 Mongoose 处理表单验证?您使用的是自定义方法、某些插件还是默认的错误数组?

虽然我可能会看到使用默认错误数组进行一些非常简单的验证,但这种方法似乎在嵌套模型的场景中崩溃了。

【问题讨论】:

    标签: node.js validation 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 的清理方法访问嵌套数据吗?
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 2019-03-17
    • 1970-01-01
    • 2012-08-07
    • 2013-11-06
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多