我们使用 Mongoose 这个模块操作 mongodb 进行增删改查。
app.js
使用全局变量实现数据库操作
global.dbHelper = require('./common/dbHelper');
global.db = mongoose.connect(config.mongodb);
./common/model.js
数据库集合设计:user
(用户信息)、commodity
(商品信息)、cart
(购物车信息)
module.exports = {
user:{
name: {type: String,required: true},
password: {type: String, required: true}
},
commodity: {
name: String,
price: Number,
imgSrc: String
},
cart: {
uId: {type: String},
cId: {type: String},
cName: { type: String},
cPrice: { type: String},
cImaSrc: { type: String},
cQuantity: { type: Number},
cStatus: { type: Boolean,default: false}
}
}
优点:
- 封装了数据库的操作,给人的感觉是同步的,其实内部是异步的。如 mongoose 与 MongoDB 建立连接:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var BlogModel = mongoose.model('Blog', { title: String, content: String });
BlogModel.find()
- 支持 Promise。这个也无需多说,Promise 是未来趋势,可结合 co 使用,也可结合 async/await 使用。
- 支持文档校验。如上所述。
缺点:
- 功能多,复杂。Mongoose 很强大,有很多功能是比较鸡肋甚至可以去掉的,如果使用反而会影响代码的可读性。比如虚拟属性以及 schema 上定义 statics 方法和 instance 方法,可以把这些定义成外部方法,用到的时候调用即可。
- 较弱的 plugin 系统。如:
schema.pre('save', function(next) {})
和schema.post('find', function(next) {})
,只支持异步next()
,灵活性大打折扣。 - 其他:对新手来说难以理解的 Schema、Model、Entry 之间的关系;容易混淆的 toJSON 和 toObject,以及有带有虚拟属性的情况;用和不用 exec 的情况以及直接用 then 的情况;返回的结果是 Mongoose 包装后的对象,在此对象上修改结果却无效等等。
上一节:4.5 页面设计
下一节:4.7 注册