朋友前些时候,让我给他写一个公司产品,新闻简介的网站. 正好当时看了一会儿nodejs, 就想着用 express + mongodb 写一个.
我喜欢上mongodb的原因主要是它的文档存储. 比如一个典型的对象商品
, 在MySQL里面 可能需要 product
, product_image
, product_attribute
三个数据表进行描述, 增删改查
, 各种操作都比较麻烦, 但是在mongodb中.只需要一个 product
的文档就可以描述商品了. 结构类似这样:
<!-- lang: js -->
{
"name": "product_1",
"price": "100",
"description": "<h3>Description</h3><p>Content</p>",
"attributes": [{
"name": "name_1",
"value": "value_1"
}, {
"name_2": "value_2"
}],
"images": [
...
]
}
更多
原生的mongodb
在进行增删改查
的时候需要自己转换数据类型, 比如express req.params 里面取到的字段都是String
类型, 需要自己转换成ObjectId
, Number
才能正确的进行增删改查操作.每次处理请求都要多打几行转换数据类型的代码,又难看又麻烦. google之. 找到了 mongoose
, 增删改查就方便多了. 起步
网上给的方法是直接在项目文件夹的package.json
里面的dependencies
中加上express
,然后 npm install
, 实测这样安装会导致一些express
引用的东西无法安装上.
正确的方法是 在nodejs.exe
所在目录 运行 npm install express-generator
, 然后把 X:\xxx\nodejs\node_modules\.bin
加到PATH环境变量. cd
到需要使用express
项目的根目录, 运行 express
, 然后 express-generator
会自动帮你创建 package.json
, 然后你只需要再运行 npm install
就能正确安装express
以及它的一些引用了.
这是mongoose安装文件夹下给了一个例子, 用的是全局变量.
<!-- lang: js -->
//app.js
var express = require('express')
var mongoose = require('mongoose')
var uri = 'mongodb://localhost/mongoose-shared-connection';
global.db = mongoose.createConnection(uri);
var routes = require('./routes')
var app = express();
app.use('/', routes.home);
app.use('/insert', routes.insert);
app.use('/name', routes.modelName);
app.listen(8000, function () {
console.log('listening on http://localhost:8000');
})
//modelA.js
var Schema = require('mongoose').Schema;
var mySchema = Schema({
name: String,
name2: Type2,
name3: Type3
});
// db is global
module.exports = db.model('MyModel', mySchema);
//在router里面require这个model就可以对数据库进行操作了.
具体可以自己按照自己项目的实际情况进行修改.
在本地写好后,上传百度云发现程序运行一会儿就会报连接失败的错误.主要是因为百度云的mongodb
服务器不是长时间保持连接. 在30秒没有动作后, 服务器会主动断开.
所以需要加几行代码. 捕捉连接数据库失败的错误, 和服务端断开连接后的重连.
<!-- lang: js -->
//database.js
var mongoose = require('mongoose');
global.db = mongoose.createConnection();
var host, database, port, options;
if (process.env.SERVER_SOFTWARE == 'bae/3.0') {
host = 'mongo.duapp.com';
database = 'your bae database name';
port = 8908;
options = {
server: {poolSize: 5},
user: 'ak',
pass: 'sk',
};
} else {
host = 'localhost';
database = 'test';
port = 27017;
}
db.on('error', function(err) {
//do something..
});
//断线重连.
db.on('disconnected', function() {
db.open(host, database, port, options);
});
db.open(host, database, port, options);
然后在使用 db
这个变量之前的一个地方 require('database') 就行了, 比如 app.js
里面, 或者 start.js
里面
最终的效果点这里