在./server/config/%ENV%/setting.js里,model.db节点配置了MongoDB的连接设置:
model: {
//mongodb connection config
db: {
host:"127.0.0.1",
port:27017,
name:"weroll_app", //the name of database
option: {
driver:"mongoose", //or "native"
server: {
reconnectTries: Number.MAX_VALUE,
poolSize: 5,
socketOptions: { keepAlive: 120 }
}
}
},
//redis connection config
//redis: { ... }
}
对于weroll应用来说,数据库并不是必须的,如果你不需要连接数据库,可以将model.db节点注释。
weroll同时支持MongoDB官方的Node.js版连接库,和Mongoose库。设置model.db.option.driver,可以选择使用官方driver或Mongoose,option的其他参数请参考MongoDB官方文档。
配置setting.js中的model.db节点:
{
model: {
db: {
...
option: {
driver: "native",
...
}
}
}
}
在main.js入口文件中初始化Model对象,Model对象将根据setting.js中的配置连接MongDB数据库:
//./main.js
var Setting = global.SETTING;
app.addTask(function(cb) {
var Model = require("weroll/model/Model");
Model.init(Setting.model, function(err) {
cb(err);
});
});
Model.DB对象封装了一些常用的CURD方法,我们以findOne为例子,示例代码如下:
var Model = require("weroll/model/Model");
//callback
//find(tableName, filter, fields, sort, pagination, callBack)
Model.DB.findOne("User", { name:"Jay" }, { _id:1, name:1, phone:1 }, function(err, doc) {
console.log(arguments);
});
//Promise
Model.DB.findOne("User", { name:"Jay" }, { _id:1, name:1, phone:1 }).then(function(doc) {
console.log(doc);
}).catch(function(err) {
console.error(err);
});
//async & await
async function() {
var doc = await Model.DB.findOne("User", { name:"Jay" }, { _id:1, name:1, phone:1 });
console.log(doc);
});
详细使用方法,请参考test里的代码。
配置setting.js中的model.db节点:
{
model: {
db: {
...
option: {
driver: "mongoose",
...
}
}
}
}
然后在main.js入口文件中初始化Model对象和DAOFactory对象:
/* ./main.js */
var Setting = global.SETTING;
var Model = require("weroll/model/Model");
app.addTask(function(cb) {
Model.init(Setting.model, function(err) {
cb(err);
});
});
app.addTask(function(cb) {
var DAOFactory = require("weroll/dao/DAOFactory");
DAOFactory.init(Model.getDBByName(), function(err) {
cb(err);
});
//可以指定DAO文件的存放目录,默认是 ./server/dao 目录
//var folder = require("path").join(global.APP_ROOT, "server/dao");
//DAOFactory.init(Model.getDBByName(), { folder:folder }, callback);
});
DAOFactory对象会遍历dao目录和其子目录,将文件名为 XXXSchema.js 的文件作为Schema注册到mongoose实例里。比如UserSchema.js文件,初始化之后,你就可以在应用程序的任何一个地方使用User(User是mongoose里的Model对象)来操作数据,不需要require来导入。
在weroll中使用mongoose的Model来操作数据库和官方一样,没有什么区别,以下是一段查询的示例代码:
//findOne with callback
User.findOne({ phone:"123456" }, function(err, doc) {
console.log(arguments);
});
//findOne with async/await
async function() {
var doc = await User.findOne({ phone:"123456" }).exec();
console.log(doc);
}
一个典型的Schema文件的定义如下:
//./server/dao/StudentSchema
var Schema = require("weroll/dao/DAOFactory").Schema;
var COLLECTION_NAME = "Student"; //定义表名为Student
module.exports = function() {
var schema = new Schema({
name: { type:String, index:true, required:true },
head: "String"
}, { collection:COLLECTION_NAME, strict: false });
schema.pre("save", function(next) {
//do something before save
next();
});
schema.static("queryByName", function(name, fields, callBack) {
return this.find({ name:name }).select(fields).exec(function(err, doc) {
callBack && callBack(err, doc);
});
});
return { name:COLLECTION_NAME, ref:schema };
}
定义Schema和官方用法一致,请参考mongoose文档。当DAOFactory.init完成之后,直接使用Student即可引用mongoose的Model对象。
weroll应用允许同时连接多个MongoDB数据库,分为主连接(或者叫默认连接)和其他连接。mongoose库只允许用在主连接上,native driver可以则两者都可以使用。示例代码如下:
var Model = require("weroll/model/Model");
//建立主连接
var db_config_default = {
host:"127.0.0.1",
port:27017,
name:"mydb",
option: { driver:"native" }
};
Model.openDB(db_config_default, true, function(err, db) {
//default mongodb is connected with native driver
//CURD example:
Model.DB.findOne();
});
//建立其他连接
var db_config_other = {
host:"192.168.1.200",
port:27017,
name:"yourdb",
option: { driver:"native" }
};
Model.openDB(db_config_other, false, function(err, db) {
//another mongodb is connected with native driver
//CURD example:
Model.DB.yourdb.findOne();
//or
Model.DB["yourdb"].update();
//"yourdb" is the name of database which defined in config above
});
关闭数据库连接
//关闭主连接
Model.closeDB(function(err) {
err && console.error(err);
});
//关闭某个连接
Model.closeDB("name of database in config", function(err) {
err && console.error(err);
});