如果你之前对mysql以及Oracle等关系数据库有过了解的话,那么你mongodb对于你来说上手应该是很快的。但是mongodb并不是使用诸如mysql与Oracle中的select、delete、update等关键字进行SQL查询的,因为具mongodb官方介绍说,mongodb是一个nosql的数据库,也就是说,他不需要你对sql语句有一定的了解,但是如果你已经了解了sql语句,那么我相信你学习起来是很快的。
网上已经很多这方面的教程了,为什么我还要在写一次?
主要是因为我在参照网上的相关例子的时候遇到了不少问题,有些例子要么是express版本低,要么就是代码不完整,因此我才打算写这一篇文章来与大家分享下学习心得。本文仅作为express+mongodb入门教程。使用的express版本为~4.15.2,
准备工作
看到标题就知道应该需要安装些什么软件了吧,我们需要在电脑上安装nodejs和mongodb,而express是nodejs的一个插件,因此需要通过nodejs来进行安装。
nodejs与mongodb的安装非常的简单,只要你会安装QQ,会安装游戏,那么你就会安装nodejs和mongodb了。不过我们需要注意的是,mongodb安装后,我们需要对其进行相应的设置,以提高我们的开发效率。关于mongodb的使用方法,请大家查看官方的文档。
安装好了mongodb后,我们给mongodb的bin目录添加到环境变量里面,这样我们就可以直接在命令提示符中直接使用mongodb的命令了,省的还要跑到mongodb目录下输命令。下面是设置mongodb的环境变量的方法。
mongodb添加环境变量
在桌面上,我的电脑(计算机或者此电脑)右键,点击属性,选择左边的“高级系统设置”,在弹出窗口中,选择“高级”,看到右下角有个“环境变量”,点击它。
之后我们在“系统变量”(不是Administrator的用户变量)中Path中将mongodb的bin目录填写进去,比如我的bin目录是C:\Program Files\MongoDB\Server\3.4\bin。
然后,打开你的命令提示符窗口,输入mongo,如果看到下面的信息,说明你的设置已经成功了。
1 | C:\Users\Administrator>mongo |
2 | MongoDB shell version v3.4.3 |
3 | connecting to: mongodb://127.0.0.1:27017 |
4 | MongoDB server version: 3.4.3 |
5 | Server has startup warnings: |
6 | 2017-04-19T13:51:47.704+0800 I CONTROL [initandlisten] |
7 | 2017-04-19T13:51:47.704+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. |
8 | 2017-04-19T13:51:47.705+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. |
9 | 2017-04-19T13:51:47.705+0800 I CONTROL [initandlisten] |
2、在nodejs中安装express
打开nodejs的命令窗口,输入以下命令进行express全局安装
npm install -g express
OK,安装会有些慢,如果觉得很慢,请使用taobao的node镜像。完成后,我们就来创建一个express项目吧
直接使用命令
express test –view=ejs
//test就是项目的名称及目录,–ejs则是使用ejs模板引擎,如果不使用–ejs,默认就是jade模板引擎。
在这里我使用ejs模板引擎,因为它跟html一样,易看易懂,如果你之前使用过asp、jsp的话,那么你一看就懂了,根本不需要再进行多余的学习,如果没有用过,那还是学习下的好,不过这个模板引擎也是非常简单易学的,大部分懂js的或懂一点后端的应该看一下就会了吧。
项目创建完成,我们需要安装相关的依赖包了
cd test & npm install
现在我们已经创建好了test项目了,我们看看项目的目录
–bin //这个是express服务端的配置文件
–node_modules //一些依赖的库
–public //静态文件目录(css、js、images等)
–views //ejs模板文件(视图)
–app.js //express配置文件
–package.json //项目信息及依赖库的json信息
到此,项目创建完成了。下面我们需要与mongodb进行相关的链接,那就必须得安装一个mongoose的依赖库,直接使用命令
npm install mongoose –save
这样就安装成功了。下面我们正式进入express+mongoose+mongodb的数据库操作吧。
重要部分来了:由于express与nodejs一起使用,无法实现热加载(所谓热加载就是无需重启node来刷新页面),因此我们需要另一个插件hotnode,使用hotnode可以让我们更好的调试代码与测试代码。hotnode可以全局安装,也可以依赖安装,我这里使用全局安装,使用
1 | |
2 | ## express+mongodb+mongoose链接数据库 |
3 | ### 使用mongodb创建一个数据库 |
4 | 首先在命令提示符中输入如下命令来指定数据库存储的文件夹 |
5 | ```mongod --dbpath H:\DB |
这个H:\DB,你自己设置成你想要的目录即可
设置好了以后,我们需要再开启一个命令提示符窗口,直接使用mongo命令就可以看到已经链接上了本地上的db目录了。
下面我们就来创建一个数据库,使用use命令
1 | use test //如果数据库不存在则会自动创建一个名为test的数据库 |
我们再创建一个数据库表为user,并且添加一个admin用户
1 | 查看数据库信息,请使用find |
2 | ```db.user.find() |
是不是很简单啊。
至此,我们需要将以上mogodb的两个窗口都保留,这样才能保证我们后面的步骤。关闭后则数据库连接就断了。当然你也可以将其注册成为windows的一个服务,相关命令请自行google.
连接到test数据库
打开app.js
添加如下代码测试数据库链接是否成功:
1 | /*引入mongoose链接数据库*/ |
2 | var mongoose = require('mongoose'); |
3 | mongoose.connect('mongodb://localhost/one'); |
4 | var db = mongoose.connection; |
5 | db.on('error', console.error.bind(console, 'connection error:')); |
6 | db.once('open', function() { |
7 | console.log('链接成功了') |
8 | }); |
现在我们就可以测试下数据库连接是否成功了。使用hotnode的命令启动服务
1 | 当在命令提示符中看到“连接成功了”,那么就说明了我们已经链接了数据库了。 |
2 | |
3 | ## 使用bootstrap与express的router创建登录与注册 |
4 | 首先下载bootstrap3与jQuery,将css文件放到public/stylesheets目录下,将js文件及jQuery文件放到javascripts目录下,另外bootstrap是需要自提支持的,因此直接将bootstrap的fonts目录直接拷贝到public目录下即可。 |
5 | |
6 | ### 修改views目录下index.ejs文件 |
7 | ```html |
8 | <% include header.ejs %> |
9 | <div class="index"> |
10 | <div class="container"> |
11 | <h1><%= title %></h1> |
12 | <form name="form" action="/home" method="post"> |
13 | <div class="input-group"> |
14 | <span class="input-group-addon" id="sizing-addon1">USERNAME</span> |
15 | <input type="text" name="name" class="form-control" placeholder="用户名" aria-describedby="sizing-addon1" id="name"> |
16 | </div> |
17 | <div class="input-group"> |
18 | <span class="input-group-addon" id="sizing-addon2">PASSWORD</span> |
19 | <input type="password" name="password" class="form-control" placeholder="密码" aria-describedby="sizing-addon2" id="password"> |
20 | </div> |
21 | <a href="/register" class="btn btn-warning reg">注册</a> |
22 | <input name="submit" type="submit" class="btn btn-primary login" value="登录"> |
23 | </form> |
24 | </div> |
25 | </div> |
26 | <% include footer.ejs %> |
看到了吧,如果你懂jsp,那么你就能看懂上面的代码了,很简单的,当然懂JavaScript也能很容易看懂以上代码,只不过代码中的include可能就不太了解了,include是引入一个文件,然后我们来建立header.ejs和footer.ejs,让他们两个文件可以进行重用
header.ejs文件内容
1 |
|
2 | <html> |
3 | <head> |
4 | <title><%= title %></title> |
5 | <link rel='stylesheet' href='/stylesheets/bootstrap.min.css' /> |
6 | <link rel='stylesheet' href='/stylesheets/style.css' /> |
7 | </head> |
8 | <body> |
footer.ejs
1 | <script src="/javascripts/jquery-3.2.1.min.js"></script> |
2 | <script src="/javascripts/bootstrap.min.js"></script> |
3 | </body> |
4 | </html> |
修改routers/index.js
1 | ; |
2 | var express = require('express'); |
3 | var router = express.Router(); |
4 | |
5 | /* GET home page. */ |
6 | router.get('/', function(req, res) { |
7 | res.render('index', { title: '后台登录' }); |
8 | }); |
9 | module.exports = router; |
路由为我们创建了第一个页面,并传递一个title参数。
修改public/stylesheets/style.css
1 | .index { |
2 | width: 80%; |
3 | position: absolute; |
4 | top: 50%; |
5 | left: 50%; |
6 | transform: translate(-50%, -50%); |
7 | } |
8 | .index h1 { |
9 | text-align: center; |
10 | color: #333; |
11 | border-bottom: 1px #eee solid; |
12 | padding-bottom: 10px; |
13 | } |
14 | .index .container { |
15 | width: 400px; |
16 | background: #fff; |
17 | border-radius: 6px; |
18 | padding: 10px; |
19 | box-shadow: 0 0 8px #ccc; |
20 | } |
21 | .index .container .input-group { |
22 | margin: 20px auto; |
23 | } |
24 | .index .container .login { |
25 | float: right; |
26 | } |
27 | .index .container .reg { |
28 | float: left; |
29 | } |
OK,现在我们可以看看浏览器中所显示的状况了,如果你没有操作错误的话,你应该看到如下图一样的效果:
6、新建user.js
在test目录下创建一个model文件夹,并新建一个user.js的文件,内容如下:
1 | /** |
2 | * Created by tony on 2017/4/18. |
3 | */ |
4 | var mongoose = require('mongoose'); |
5 | |
6 | var UserSchema = new mongoose.Schema({ |
7 | name: String, |
8 | password: String |
9 | }); |
10 | module.exports = mongoose.model('user', UserSchema,'user'); |
以上代码主要是创建一个数据模型对应于数据库内容,这个数据库模型就相当于java中的javabeans。我们需要注意的是最后一行,mongoose.model(‘user’, UserSchema,’user’),这里面的最后一个参数’user’就是我们创建的test数据库下面的user表的名称。如果不填写这个参数,后面我们可能将无法获取到user中的数据,当然后面你也可以直接使用for循环来循环,但是如果数据量太大,我相信for肯定不会那么好使了。
下面是非常重要的两个步骤,我都对代码进行了注释,大家一定要好好看。
7、编写注册页面(注册的密码通过MD5加密)
在views下新建register.ejs
1 | <% include header.ejs %> |
2 | <div class="index"> |
3 | <div class="container"> |
4 | <h1><%= title %></h1> |
5 | <form id="form" action="/register_suc" method="post"> |
6 | <div class="input-group"> |
7 | <span class="input-group-addon" id="sizing-addon1">USERNAME</span> |
8 | <input type="text" name="name" class="form-control" placeholder="用户名" aria-describedby="sizing-addon1" id="name"> |
9 | </div> |
10 | <div class="input-group"> |
11 | <span class="input-group-addon" id="sizing-addon2">PASSWORD</span> |
12 | <input type="password" name="password" class="form-control" placeholder="密码" aria-describedby="sizing-addon2" id="password"> |
13 | </div> |
14 | <input type="submit" class="btn btn-primary login" value="注册" > |
15 | </form> |
16 | </div> |
17 | </div> |
18 | <% include footer.ejs %> |
然后在routers下建立register.js
1 | ; |
2 | var express = require('express'); |
3 | var router = express.Router(); |
4 | |
5 | /* GET home page. */ |
6 | router.get('/', function(req, res) { |
7 | res.render('register', { title: '用户注册' }); |
8 | }); |
9 | |
10 | module.exports = router; |
我们已经完成了注册页面了,下面就是与数据库对接了。
在routers目录下新建register_suc.js
register_suc.ejs
1 | ; |
2 | var express = require('express'); |
3 | var router = express.Router(); |
4 | var mongoose = require('mongoose'); |
5 | var user = require('../model/user'); |
6 | /*导入node的加密库*/ |
7 | var crypto = require('crypto'); |
8 | |
9 | /* GET home page. */ |
10 | router.post('/', function(req, res) { |
11 | var md5 = crypto.createHash('md5'); |
12 | var name = req.body.name; |
13 | var password = req.body.password; |
14 | if(name==='' && name.length<=0 && password==='' && password.length<=0){ |
15 | res.render('register_suc.ejs', {title: '用户名或密码不能为空', name: '', password: ''}); |
16 | }else { |
17 | /*MD5加密密码*/ |
18 | md5.update(password + name); |
19 | var pwd = md5.digest('base64');//将加密后的md5密码使用base64加密 |
20 | //使用findOne查询数据库中是否存在相同的用户名,如果存在则提示更换用户名,否则将内容写入数据库 |
21 | user.findOne({name: name}, function (err, doc) { |
22 | if (err) return next(err); |
23 | //查询数据库是否有相同的用户名,假如存在则提示注册失败 |
24 | if (doc) { |
25 | res.render('register_suc.ejs', {title: '用户名已经存在,请更换', name: '', password: ''}); |
26 | } else { |
27 | /*var usernow =new user({name:name,password:pwd}); |
28 | //如果用户名不存在,则将当前用户名和密码保存到数据库 |
29 | usernow.save(); |
30 | res.render('register_suc.ejs', { title: '注册成功',name:name,password:pwd });*/ |
31 | user.create({ // 创建一组user对象置入model |
32 | name: name, |
33 | password: pwd |
34 | }, function (err, doc) { |
35 | if (err) { |
36 | res.send(500); |
37 | console.log(err); |
38 | } else { |
39 | res.render('register_suc.ejs', {title: '注册成功', name: name, password: pwd}); |
40 | //res.send(200); |
41 | } |
42 | }); |
43 | } |
44 | }) |
45 | } |
46 | }); |
47 | |
48 | |
49 | module.exports = router; |
在views目录下新建一个register_suc.ejs
1 | <% include header.ejs %> |
2 | <div class="index"> |
3 | <div class="container"> |
4 | <h1><%= title %></h1> |
5 | <%if(name!='' && password != ''){%> |
6 | 用户名:<%=name%><br>密码:<%=password%> |
7 | <%}%> |
8 | </div> |
9 | </div> |
10 | <% include footer.ejs %> |
到这里还没有完哦,我们建立了router后,必须要在app.js中加入router,否则将无法实现router功能,打开app.js,增加以下内容
var register = require(‘./routes/register’);
var register_suc = require(‘./routes/register_suc’);
app.use(‘/register’, register);
app.use(‘/register_suc’, register_suc);
OK,现在我们就可以看看效果了,http://localhost:3000/register,可以看到如下画面
你试着输入用户名和密码,然后点击注册看看,是否会出现如下画面,如果出现了那恭喜你,你离成功越来越近了:
注册功能实现了,下面我们就实现下登录功能吧
8、编写登录页面
首先我们的在views下新建一个home.ejs来显示登录成功后的用户名
home.ejs
1 | <% include header.ejs %> |
2 | <div class="index"> |
3 | <div class="container"> |
4 | <h1><%= title %></h1> |
5 | <%if(name !='' && name.length>0){%> |
6 | <%=name%> |
7 | <%}%> |
8 | </div> |
9 | </div> |
10 | <% include footer.ejs %> |
然后我们需要配置home的路由,因此我们还需要在routers目录下新建一个home.js的文件
home.js
1 | ; |
2 | var express = require('express'); |
3 | var router = express.Router(); |
4 | var mongoose = require('mongoose'); |
5 | var user = require('../model/user'); |
6 | /*导入node的加密库*/ |
7 | var crypto = require('crypto'); |
8 | /* 创建路由,并使用post接受index传递过来的name和password */ |
9 | router.post('/', function(req, res, next) { |
10 | var md5 = crypto.createHash('md5'); |
11 | var password = req.body.password;//获得传递过来的password |
12 | var name = req.body.name;//获得传递过来的name |
13 | md5.update(password+name);//MD5混淆加密内容为password+name |
14 | var pwd = md5.digest('base64');//将加密好的MD5以base64的形式展现出来 |
15 | if(pwd==='' && name ===''){//假如传递过来的name和password为空 |
16 | res.render('home', { title: '发生错误',name:'请输入用户名和密码' });//路由则传递相关错误信息 |
17 | } |
18 | //console.log(pwd+' '+name); |
19 | /* 查询数据库中的name与password是否与用户输入的一致,使用findOne({},callback)方法 */ |
20 | user.findOne({ name:name,password:pwd },function (err, doc) { |
21 | if (err) return next(err); |
22 | if(doc){ |
23 | res.render('home', { title: '登录成功',name:name }); |
24 | }else{ |
25 | res.render('home',{title:'发生错误',name:'请检查您的用户名及密码'}); |
26 | } |
27 | }); |
28 | }); |
29 | |
30 | module.exports = router; |
终于完成了,下面我们就直接打开http://localhost:3000进行登录吧,记得之前我们创建的admin的密码是未进行加密的,因此在这里直接使用admin登录是不可行的,因为其密码与加密后的密码不一致,因此你不必为此劳心费神,追求完美。
我们输入之前我们注册的egtch.com的用户名,再输入密码来进行登录,即可登录成功。如图: