我开始冒险使用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');};
我的问题:
答案 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开始的地方,然后该项目多年来变为现状)。