Mongoose模型验证范围

时间:2014-01-16 11:12:15

标签: node.js mongodb express mongoose

我开始冒险使用node,express和nodejs(我来自PHP env)。虽然大部分内容非常简单,但我想保持我的模型清洁,当它变得复杂时我无法弄清楚如何分离验证内容。

我的产品型号:

var mongoose = require('mongoose');
var schema = new mongoose.Schema({
     title: String,
     content: String,
     update_date: Date,
});

var model = mongoose.model ('Page', schema);

exports = module.exports = function (db) {   return db.model('Item');};

我的问题:

  1. 有没有办法(快速扩展)来处理验证方案/范围(类似于ror和yii)...... 示例验证范围:
    • 在“创建”范围字段标题中,应该要求内容
    • 在“更新”范围字段中,应该需要update_date并使用日期类型
    • 进行验证
    • 在“清除”范围字段中,内容和update_date验证为空
  2. 你在快递中划分了猫鼬模型(db abstration)和商业模式吗?

1 个答案:

答案 0 :(得分:1)

查看express-validator,这将允许您在各个路线中执行验证(MVC倾向的控制器)。

虽然上述工作正常,但mongoose为您提供了很大的灵活性,并且已经预装了验证机制。除非您真的需要,否则重新架构此功能是没有意义的,这样做会在您的路线中产生很多噪音。我会考虑使用本机MongoDB驱动程序和您自己的自定义逻辑进行预卷 - 如果不是这样的话 - 使用本机驱动程序真的不那么难,但如果项目将会增长,mongoose会给你很多强大的功能,你不想自己处理。

虽然大多数网上联合会在一个大文件中显示mongoose模型,但将模型分成逻辑部分相对容易(并且更可取)。这通常是我设置的方式:

models/
  User/
    index.js
    statics.js
    methods.js
    validators.js
    middleware.js
routes/
views/

models/User/index.js内部,我们可以创建我们的架构,并为我们的文件拆分添加一些粘合代码:

require('./models/User')

然后我们可以将var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ name: String, password: String, role: String }); userSchema.statics = require('./statics'); userSchema.methods = require('./methods'); // This will go through each exports in the validators file and attach // the exported function as a validator. You're validators file should // name each validator after the field in which it intends to validate. // See below for example validators file. var validators = require('./validators'); Object.keys(validators).forEach(function (validator) { userSchema.path(validator).validate(validators[validator]); return; }); // Do the following for each type of middleware you use in the model var preSave = require('./middleware').preSave; preSave.forEach(function (middleware) { userSchema.pre('save', middleware); return; }); module.exports = mongoose.model('User', userSchema); 文件设置为:

validators.js

通过滚动插件为您提供此接口而不需要所有样板,您可以更进一步。我还没有走过这条路,但exports['name'] = function () { /* validation code here */ }; exports['password'] = function () { /* validation code here */ }; exports['role'] = function () { /* validation code here */ }; //etc, etc, etc. 的插件开发非常简单:http://mongoosejs.com/docs/plugins.html

请记住,mongoose未在RoR或Yii之后建模。红宝石中的Sinatra最接近nodejs世界之外的express。 (我相信在Sinatra之后建模是TJ开始的地方,然后该项目多年来变为现状)。