如何在Node.js + Express + Mongoose + Jade中处理表单验证,特别是涉及嵌套模型的情况。

14
你在使用Express和Mongoose处理表单验证时是如何操作的?你使用自定义方法、某些插件还是默认的错误数组?
虽然在某些非常简单的验证情况下,你可以考虑使用默认的错误数组,但是这种方法在嵌套模型的情况下可能会出现问题。
3个回答

19
我个人使用node-validator来检查用户输入的所有字段是否正确,甚至在将其呈现给Mongoose之前。
Node-validator还适用于创建所有错误列表以供用户查看。

我以前没有看过这个,谢谢。但我不喜欢验证跟路由/控制器逻辑紧密绑定的方式。感觉你可能会重复很多代码。 - Chance
2
你想在哪里处理验证? 控制器/路由是正确的地方,因为它是数据进入系统的“入口点”。你可以将其转移到模型中,但模型关注数据的持久性/检索。控制器/路由是最好的选择。 - jcolebrand
5
在大多数领域驱动设计中,模型关注业务逻辑、数据完整性和规则验证,而其他参与者(包括自身)则关注数据持久化/检索。我意识到模型处理数据部分,但我认为它们也应该处理验证。我不认为这是把验证“卸载”给它们。 - Chance
1
我喜欢这个,但在发送到服务器之前,是否应该包括客户端验证? - Stephen
在我看来,在客户端、控制器和数据层中都要进行验证! - wprl
我知道这是一个非常老的帖子,但我想知道基于node-validator的中间件express-validator是否足够好用? - Saransh Mohapatra

14

Mongoose有验证中间件。您可以为模式项单独定义验证函数。嵌套项目也可以进行验证。此外,您可以定义异步验证。要了解更多信息,请查看mongoose页面

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具有验证,那么错误不会被冒泡。 - Chance
Stephen: 我想 Backbone 的模型验证可以在客户端上使用。但它可能有些混淆,混合了客户端/服务器端代码。Dailyjs 写了一篇文章 - Erhan
抱歉,我的意思是PersonSchema = new Schema({ accounts : [AccountSchema] }),而不是另一种方式(这是不可能的 - 是我的错误)。当我有一个集合时,我没有得到错误冒泡上来。我会再试一次看看是否有效。谢谢。 - Chance
我错过了你最初做的事情,这就是我最终采用的方案(谢谢)。 - Chance

5
我个人使用 express-form 中间件进行验证;它还具有过滤功能。它基于 node-validator,但对 express 有额外的奖励。它向请求对象添加一个属性,指示它是否有效,并返回错误数组。
如果您正在使用 express,则可以使用此中间件。

1
Chaz,你有没有用express-form中的清理方法来访问嵌套数据的好方法? - Anders Östman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接