2014-01-16 134 views
0

我開始我的冒險與節點,表達和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. 有什麼辦法(express擴展)來處理驗證場景/範圍(如在回報率和警予類似)... 實例驗證範圍:
      在「創造」
    • 範圍字段標題,內容都被要求「更新」範圍
    • 現場UPDATE_DATE應要求與Date類型驗證了「清」範圍
    • 字段內容和UPDATE_DATE確認爲空
  2. 你劃分在快遞貓鼬模型(DB abstration)和商業模式?

回答

1

檢出express-validator這將允許您在您的個人路線(MVC傾向控制器)中執行驗證。

雖然上述工作,mongoose爲您提供了很大的靈活性,並且已經預裝了驗證機制。除非您真的需要,否則重新構建此功能是沒有意義的,這樣做會在您的路線中產生大量噪音。我會考慮使用本地MongoDB驅動程序和您自己的定製邏輯進行註冊,如果您覺得其他情況 - 使用本機驅動程序並不那麼難,但是如果項目將會增長,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.  

你可以把所有的這一步以滾動插件來提供這種接口你沒有所有的樣板。我還沒有走下那條路,但插件開發mongoose是超級簡單:http://mongoosejs.com/docs/plugins.html

請記住express不是模仿RoR或Yii。紅寶石中的Sinatra與nodejs世界以外的express最接近。 (我相信在Sinatra之後建模是TJ開始的地方,然後這個項目在過去的幾年中一直髮展到目前的狀態)。