express+mongodb

最近几天想把毕设的基本工作做好。因为我和Parter做的是一个网购比价网站,他使用的是mongodb作为数据库,而我也不用怎么操作数据。我打算使用前后端分离来完成项目,后端获取数据,传递json数据到前端,前端展示这些数据就ok了。所以我的第一步当然是尝试从后端获取数据。Parter给我提供了一个远程mongdb的地址,工作开始。

Mongodb

数据库的安装

官网,找到下载页,选择合适的版本下载。安装时,自定义路径,我使用的是D:\mongodb

创建文件

数据库安装完,需要自己手动建几个文件。在数据库根目录下,建两个目录data、logs,并在data下建db目录,在logs下建mongod.log文件。结构如下

1
2
3
4
5
6
-mongodb
-bin
-data
-db
-logs
mongod.log

启动服务器

  • 第一种方法
    首先进入bin目录,输入一下命令
    1
    mongod.exe --dbpath d:\mongodb\data\db

如果执行成功,应该可以看到一堆不是报错的文字。
访问localhost:27017,可以看到有相应访问的文字提示,说明访问成功。

  • 第二种方法
    看到网上很多都是说修改config文件,却并不直说先自己建一个config文件。在根目录下建一个mongodb.conf的文件,填入一下信息
    1
    2
    3
    4
    5
    6
    dbpath=D:\mongodb\data\db #数据库路径  
    logpath=D:\mongodb\logs\mongod.log #日志输出文件路径
    logappend=true #错误日志采用追加模式
    journal=true #启用日志文件,默认启用
    quiet=true #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    port=27017 #端口号 默认为27017

可以看到,里面定义了数据库的路径以及日志路径等信息,然后输入命令

1
mongod --config "D:\mongodb\mongodb.conf"

读取config文件来启动数据库。这次启动成功后,不会出现信息。再次访问localhost:27017,查看是否成功。

网上很多关于“将MongoDB服务器作为Windows服务运行”的教程,我试了一下,有点问题,然后我就不弄了,因为不是必需品。

Robomongo

一个管理mongodb的可视化工具,官网

数据库操作

保持刚才启动数据库的命令行窗口,新开一个窗口,进入bin目录,输入mongo这个命令,可以看到一些基本的信息。
继续输入

1
use nodetest1

表明我们现在要使用nodetest1这个数据库,如果不存在这个数据库,则它会自动创建。下一步,创建数据

1
2
db.usercollection.insert({ "username" : "testuser1", 
"email" : "testuser1@testdomain.com" })

db表示我们正在使用的数据库nodetest1usercollection表示数据库下的collecttion,mongodb中的collection相当于一般数据库的table表。回车会看到

1
WriteResult({ "nInserted" : 1 })

输入一下代码:

1
db.usercollection.find().pretty()

可以看到清晰的数据展示。

若想要添加多条内容,可以

1
2
3
4
5
6
newstuff = [{ "username" : "testuser2", 
"email" : "testuser2@testdomain.com" },
{ "username" : "testuser3",
"email" : "testuser3@testdomain.com" }]

db.usercollection.insert(newstuff);

当然,以上这些操作都可以在robomongo中直接可视化操作。

Express

后端使用node来连接数据库,这里我使用了Express来简单的进行demo测试。

安装

首先安装nodejs。
然后装express

1
npm install express-generator -g

1
express demoname

这时生成一个叫demoname的项目,进入该项目,npm install添加依赖。添加完成后启动。

1
2
3
cd demoname
npm install
npm start

在本地localhost:3000观察是否成功。

连接mongodb

monk

monk是我使用的第一种方法,因为到后面出现了一些问题,所以我现在使用的是mongoose这种方法。
先介绍使用monk吧。

  1. 添加依赖

打开刚才新建项目中的package.json文件,在原来的基础上加上mongo和monk的依赖,类似

1
2
3
4
5
6
7
8
9
10
11
"dependencies": {
"body-parser": "~1.15.1",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.13.4",
"jade": "~1.11.0",
"morgan": "~1.7.0",
"serve-favicon": "~2.3.0",
"mongodb": "^1.4.4",
"monk": "^1.0.1"
}

重新npm install

  1. 修改app.js

打开项目中的app.js,添加新的代码

1
2
3
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/nodetest1');

继续添加(一下这段代码好像要放在app.use('/', routes);上面,否则会出错)

1
2
3
4
5
//连接数据库到路由件
app.use(function(req,res,next){
req.db = db;
next();
});
  1. 编辑index.js

打开项目目录下routes\index.js,为其添加一个路由

1
2
3
4
5
6
7
8
9
10
/* GET Userlist page */
router.get('/userlist', function (req, res) {
var db = req.db;
var collection = db.get('usercollection');
collection.find({},{},function (e, docs) {
res.render('userlist', {
"userlist": docs
});
});
});
  1. 添加jade

这里express使用的是jade模板,在views目录下创建userlist.jade文件,内容如下

1
2
3
4
5
6
7
8
9
extends layout

block content
h1.
User List
ul
each user, i in userlist
li
a(href="#")= user.username

重新npm start,打开localhost:3000/userlist查看是否成功。

mongoose

使用这种方法,我终于解决了获取远程数据库数据的问题。之所以使用这种方法,是因为我使用monk时,当我连接远程的数据库,它老是提示我“端口不在范围内”的错误。

这次不是使用express项目来连接了,而是直接写几个文件就ok。

  1. 添加模块

首先新建一个目录,在项目目录下安装各模块

1
2
npm install mongoose
npm install express
  1. 编辑app.js

在目录下自己创建一个app.js,添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var express = require('express');
var mongoose = require('mongoose');

var app = express();

app.get('/',function(req,res){
res.send('Hello, World');
});

var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;

console.log('Example app listening at http://%s:%s', host, port);
});

在命令行窗口输入

1
node app.js

如果没有错误提示,说明启动成功。
访问localhost:3000,显示Hello, World

  1. 定义models

mongoose这玩意儿似乎还有schema,model,entity这些东西,不过我也没认真去看,毕竟我不做后台,只知道schema生成model,要用mongoose就要定义schema和model。
项目目录下创建models.js。内容如下

1
2
3
4
5
6
7
8
9
10
11
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var _Movie = new Schema({
movieInfo: String,
title: String,
star: Array,
quote: String
});

exports.Movie = mongoose.model('Movie', _Movie);

我事先先看了一下远程数据库中的数据结构,然后定义如上。

  1. 添加路由

重新打开app.js,将其改为如下,
新添加

1
2
3
4
var models = require('./models');
var Movie = models.Movie;

mongoose.connect('mongodb://118.89.48.117:27017/Douban');

1
2
3
4
5
app.get('/movie',function(req,res){
Movie.find(function(err, doc) {
res.json(doc);
});
});

最终如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var express = require('express');
var mongoose = require('mongoose');
var models = require('./models');
var Movie = models.Movie;

mongoose.connect('mongodb://118.89.48.117:27017/Douban');

var app = express();

app.get('/',function(req,res){
res.send('Hello Remote Link');
});

app.get('/movie',function(req,res){
Movie.find(function(err, doc) {
res.json(doc);
});
});

var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;

console.log('Example app listening at http://%s:%s', host, port);
});

此时我访问localhost:3000/movie,效果如下

使用jsonview插件的效果如下

谢天谢地,终于访问成功了,不枉我花了一两天来解决这玩意儿,只怪自己笨吧!。
在此,非常感谢Express + Mongoose 极简入门这篇博客,这是阅读了这篇博客,才让我有了头绪。
解决了这个问题,心中的郁闷感也渐渐消退,果然像某人说的一样,解决不了的问题先放一放,睡个觉醒来说不定就有头绪了。由衷地感激这位开导我的人!
此时1:39,晚安!

新添加内容:
最近因为安全问题,小伙伴重新建了数据库,还帮我换了用户名和密码,我发现直接再连的话是连不上的,需要添加用户名和密码,格式如下:

1
mongoose.connect('mongodb://用户名:密码@数据库地址:端口号/数据库名);