百度云 nodejs express + mongodb 折腾记

由来

朋友前些时候,让我给他写一个公司产品,新闻简介的网站. 正好当时看了一会儿nodejs, 就想着用 express + mongodb 写一个.

为什么用 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 如何 增删改查?

原生的mongodb在进行增删改查的时候需要自己转换数据类型, 比如express req.params 里面取到的字段都是String类型, 需要自己转换成ObjectId, Number才能正确的进行增删改查操作.每次处理请求都要多打几行转换数据类型的代码,又难看又麻烦. google之. 找到了 mongoose, 增删改查就方便多了. 起步

express如何安装?

网上给的方法是直接在项目文件夹的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 如何与 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

在本地写好后,上传百度云发现程序运行一会儿就会报连接失败的错误.主要是因为百度云的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 里面

最终的效果点这里

你可能感兴趣的:(mongodb,nodejs,express,BAE)