0.0.1 • Published 10 years ago

express-model v0.0.1

Weekly downloads
4
License
-
Repository
-
Last release
10 years ago

express-model

为Express框架提供Model支持,可集成多种数据库(SQL & NoSQL),灵活性高的轻量级工具。 由于Express官方并未显式地提供Model支持,express-model不仅能有效嵌入Express Mvc中,还支持多种需要Model的场景

Features

  • 轻量级Controller,把更多地逻辑过程从Controller中移出,让Model分担请求压力,同时减少Controller代码量,增强代码可读性,从而加大Controller层的灵活性
  • 理论上支持多种储存格式,包括XML,JSON,文件系统,数据库以及其它存储系统,并且可根据具体情况灵活地使用对应的存储体系
  • 对上一特性的拓展,在同一个Model中,可以方便地对各存储系统实现交互,并得益于NodeJS的事件模型,这些操作对前端性能几乎不影响
  • 精简的API,尽量从使用者的角度去设计程序接口

使用指南

秉承了SeaJS与RequireJS大道至简的接口设计,你首先要在服务器开启时初始化express-model,即Express中的app.js

var model = require('express-model')
var util = require('util')
	
// some codes...
// 你必须通过传入一个字符串参数,让express-model知道你所定义的Model所在的位置
global.Models = model(util.format('%s/%s', __dirname, 'models');

下面假设你使用了express-model默认的mongoose作为数据库driver,接着你需要的就是定义一个Model,你可以在你指定的Model目录下创建一个demo.js

Models.define('yourModelName', function( out, db, cache ) {
		
	// out 是你的Model想输出的值或函数
	out.name = 'express-model 1.0';
	out.getName = function() {
		return out.name
	}
		
	// db 将引用定义在express-model/supportDB目录下对应的数据库驱动文件
	// express默认使用moogoose
	// 同时db提供一个use,来让你使用其它声明在supportDB的数据库,例如
	db.use('mysql', function(storage) {
		// mysql的操作
	})
		
	// 若你想使用同步的方式,你可以这样:
	var mysql = db.use('mysql')
	mysql.connect(...);
		
	// cache 的使用,顾名思义,就是作为缓存,不过有点特殊
	// 你先要像如下一样给out添加一个proto
	out._constructor = function() {
		// numbers of codes
	}
		
	// 它不同于其它out的proto值,它在define完后,会先执行一次来实现初始化Model的工作,因此你可以这样
	out._constructor = function() {
		cache.username = db.queryUsername(...)
	}
	out.getUsername = function() {
		return cache.username;
	}
		
	// PS:
	// - cache的实现相当简单,其实就是一句Object.create(null),然而其灵活度也大大增加了应用程序的直接效率,有效正确地使用参数cache往往事半功倍
		
})

接下来是使用刚才定义Model

var model = Model.use('yourModelName', function() {
	this.someVariable_1 = 1;
	this.someVariable_2 = 2;
	// 这个函数是一个后处理,它会向已有的添加额外的属性
})
response.render('yourViewName', model)

最后在View中使用的部分就略掉了

express-model是工具,不是Express插件,更不是框架

express-model正因此,才能得以如此灵活。 你可以很方便地把它接入任何需要与数据/存储相关的应用中,它是一个工具,帮助你的程序员们更好地在前后端之间进行交互。 可以试想一下下面的场景,你的Log使用的是mySQL,SNS应用的是MongoDB,而图片使用你自己开发的图片存储服务器集群,你可以在一个Model中这么写

Models.define('Example_1', function( out, db, cache ) {
	
	db.use('mysql', function(storage) {
		// log operators
	})
	
	db.use('JfileSystem', function(storage) {
		// file system operators
	}
	
	// default as SNS: mongoDB
	// SNS operators
	
})

另外一个场景则是,利用express-model,你可以写一个小脚本来迁移你两个数据库中的个别数据,甚至整个数据库,请看下面的代码

Models.define('Example_2', function( out, db, cache ) {
	
	db.use('mysql', function(storage) {
		var mysqlData = storage.getSomeDataFromYourMySQL(...)
		db.use('mongoDB', function(db) {
			db.appendMySQLDataToMongoDB(mysqlData);
		})
	})
	
})

下面的Project你可以看看Yorkie是如何使用Express-Model的:https://github.com/yorkie/ikanbao.fm