继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express、Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用。
这一节将重点介绍MongoDB以及它的ODM(Object-Document Modeler)Mongoose。MongoDB是一种分布式文档存储型数据库,和平时使用的关系型数据库不同,它存储的是BSON格式(json的二进制),特点是高性能、易部署,易使用...(详情请见百科),主要一点它支持JavaScript读写,MEAN栈开发的最大特点就是前后端包括数据库都是JavaScript编写。而Mongoose可以类比EntityFramwork(ORM-对象关系映射),主要做用是让开发人员可以更方便的操作数据库。在开始之前,记得先安装mongodb。
一、MongoDB准备工作
1. mongo安装完之后,用cmd切到安装目录下面的bin目录。执行mongo,如果出现版本号则说明启动成功:
如果是出现“计算机积极拒绝”,需要设置下dbpath,也就是指定数据的路径。
mongod --dbpath=c:\mongodb\db
成功之后,可以访问http://localhost:28017/ ,可以看到如下页面:
说明一切就绪。
2.为避免每次开机完都要设置dbpath,需要将mongo设置为服务启动。分两步,先用管理员身份打开cmd,切到mongo的bin目录:
D:\mongodb\bin>mongod --dbpath=D:\mongodb --logpath=D:\mongodb\log.txt --install
以上路径更换成自己的路径,然后在运行框中输入services.msc。设置服务的时候要确保mongo在运行状态,不然设置不会成功。
打开文件,找到Mongo DB:
右键选择启动,这样每次开机mongo就会自动运行。
3.更方便点,可以在桌面创建一个star.bat文件:
@echo off start "" "D:\mongodb-win32-i386-2.0.6\bin\mongo.exe"
这样每次点击直接进入命令框:
4.常用命令/基本操作
查看db:
show dbs
切换到某个数据库:
switched to db dbname
或者:
use dbname
查看某个数据库下的集合
show collections
查看集合下面的文档:
db.collections.find()
因为这一节的重点不是要介绍如何在cmd中操作mongo,所以不再赘述了。更多这样的细节可以参考一线码农的博客:8天学通mongoDB。如果是没有安装sp1的电脑,官网的3.0版本安装成功后无法运行,可以用2.xx免安装版。接下来主要讲Mongoose的操作。
二、Mongoose
1.安装
你可以用npm直接安装:
也可以用vs进行安装。右键工程上的npm,选择Install New npm Packages。
第一次会下载安装一个工具,安装完成之后,搜索Mongoose,出现下面的界面,并安装。
2.建立连接
到这一步环境终于是准备好了,接下来在app_server 文件夹下创建一个models目录,并新建一个db.js
并在db.js中引用Mongoose:
var mongoose = require('mongoose');
mongodb不需要在连接它之前创建数据库,当第一次连接的时候,会根据链接自动创建。Mongoose在连接MongoDB的时候会创建一个有五个可重用的连接的连接池,连接数是可以配置的。这么做的原因是因为连接数据库是比较耗时的操作,特别是分布式的数据库。连接字符串的规则如下:
这里用户名、密码、端口都是可以省略的,那么在本地的时候我们的连接字符串就如下:
var dbURI = 'mongodb://localhost/RClub'; mongoose.connect(dbURI);
命名我们的数据库为RClub。Mongoose会基于连接的状态发布不同的事件:
mongoose.connection.on('connected', function () {
console.log('Mongoose connected to ' + dbURI);
});
mongoose.connection.on('error', function (err) {
console.log('Mongoose connection error: ' + err);
});
mongoose.connection.on('disconnected', function () {
console.log('Mongoose disconnected');
});
如此我们可以监听连接的状态。另外应用终止需要监听nodejs的进程的SIGINT事件。而如果是nodemon重启,需要监听的是SIGUSR2事件,以便关闭连接。
// 当应用重启或终止的时候 关闭连接 Shutdown = function (msg, callback) { mongoose.connection.close(function () { console.log('Mongoose disconnected through ' + msg); callback(); }); }; // nodemon 重启 process.once('SIGUSR2', function () { Shutdown('nodemon restart', function () { process.kill(process.pid, 'SIGUSR2'); }); }); // 应用终止 process.on('SIGINT', function () { Shutdown('app termination', function () { process.exit(0); }); });