上一节讲述了创建主页,现在是登录和注册页面,为了实现这个功能,我们需要引入会话机制记录用户的状态,还要访问数据库来保存和读取用户信息,先从数据库开始。
一,访问数据库
这里是选用MongoDB作为网站的数据库系统,它是一个开源的Nosql数据库,相比MySQL那样的关系型数据库,它更轻巧,灵活,适合数据规模很大,事务性不强的场合使用;
MongoDB是一个对象数据库,它没有表,行等概念,也没有固定的模式和结构,所有的数据以文档的形式储存,所谓文档就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数,字符串,日期,数组,还可以是嵌套的文档;
//MongoDB文档示例
{
"_id" : ObjectId("3601241995"),
"uid" : 2017,
"username" : "MGT360124",
"net" : {
"sex": "M",
"emails": "1142656486@qq.com",
"address":"河北秦皇岛",
}
}
uid 是一个属性,username是一个字符串属性,_id是文档对象的标识符,格式为特定的ObjectId,net是一个嵌套的文档,其内部一一般文档一样;MongoDB格式就是json格式,在MongoDB中对数据操作都是以文档为单位的,当然也可以修改文档的部分属性,对于查询操作,只需要指定文档的任何一个属性,就可以将数据库中满足条件的所有文档刷选出来,为了加快查询,MongoDB也对文档实现了索引;
二,链接数据库
首先是安装MongoDB,安装指导
本人是将mongodb镜像安装在C:\Program Files\MongoDB\Server\3.4目录下
接下来是配置mongodb
(1)在c:\data目录下建一个db目录, c:\data\db’
(2)在 c:\data\目录下建一个logs目录, c:\data\logs ,在里面建一个文件mongo.log
(3)在c:\data目录下建一个etc目录, c:\data\etc ,在里面建一个文件mongo.conf
mongo.conf的配置信息:
#数据库路径
dbpath = c:\data\db
#日志输出文件路径
logpath = c:\data\logs\mongodb.log
#错误日志采用追加模式,配置这个选项后,mongodb的日志会追加到现有的日志文件,而不是从新创建一个文件
logappend = true
#启用日志文件,默认启用
journal = true
#这个选项可以过滤一些无用的日志信息,若需要调试请设置为false
quiet = false
#端口号默认为 27017
port = 27017
通过在命令中传参的形式启动mongo
在C:\Program Files\MongoDB\Server\3.4\bin目录下,点击鼠标右键+shift键,选择 ”在此处打开命令窗口”
在此命令行下输入:mongod --dbpath c:\data\db
之后在浏览器地址栏中输入http://localhost:27017/
说明mongo启动成功。
通过配置文件的形式启动mongodb,同时安装到window服务当中。
(1)按上面的方法进入到C:\Program Files\MongoDB\Server\3.4\bin此目录下的命令行中输入 : mongod --config c:\data\etc\mongo.conf --install --serviceName "MongoDB"
安装成功后,打开window服务,可以看到里面已经安装了MongoDB
之后,如果要使用mongodb的话,就开启服务即可,如果不设置这种方式,也可以通过上面介绍的方法开启mongodb。
开启mongodb,接下是链接mongodb数据库
为了能在node.js中使用Mongodb,我们需要获取一个模块在package.json的dependencies属性中添加一行代码:
{
’dependencies‘: {
"mongodb": "~3.4.9"
}
}
然后运行npm install 更新依赖的模块。然后在microblog目录下创建settings.js文件,这个文件用于保存数据库的链接信息,将用到的数据库命为microblog,数据库服务器在本地。settings.js文件的内容为:
//settings.js文件,这个文件用于保存数据库的链接信息
module.exports = {
cookieSecret : "microblogMGT360124",
db : "microblog",
host: "localhost",
};
//db是数据库的名称
//host 是数据库的地址
//cookieSecret是用于cookie加密与数据库无关
接下来在microblog目录下创建models目录,并且在models目录下创建一个db.js文件:
var settings = require("../settings.js");
var Db = require("mongodb").Db;
var Connection = require("mongodb").Connection;
var Server = require("mongdb").Server;
module.exports = new Db(
settings.db,
new Server(
settings.host,
Connection.DEFAULT_PORT,
{}),
{safe:true}
);
//通过module.exports输出了创建的数据库链接,这个模块只能被加载一次,
//以后在其他文件中使用时都是这个实例;在接下来会使用这个模块;
会话支持
会话是一种持久的网络协议,用于完成客户端和服务器之间的一些交互行为,一次会话可能包含多次链接,每次连接都被认为是会话的一次操作,在网络应用开发中,有必要实现会话以帮助用户交互,例如网购的场景,用户浏览了多个页面,每个页面都有购买一些东西,这些请求在多次链接中完成,许多应用层网络协议都是由会话支持的,如FTP,Telnet等。
但是HTTP协议是无状态的,本身不支持会话,因此在没有额外的手段帮助下,服务器并不知道客户购买了什么东西。
为了在无状态的http协议之上实现会话,cookie出现,cookie是一些存储在客户端的信息,每次连接的时候由客户端向浏览器提交,服务器也向浏览器发起存储cookie的请求,依靠这样的手段服务器可以识别客户端,这就是HTTP会话功能的实现。
具体过程是:浏览器首次向服务器发送请求时,服务器生成一个唯一标识并发送给客户端的浏览器,浏览器将这个唯一标识符存储在cookie中,以后每次发起请求时,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个标识符来识别客户端浏览器。
就相当于派出所给每个人发的身份证;每次要有什么事都要出示身份证(唯一标识符)给派出所。
对于开发者来说,我们无需关注浏览器的存储,需要关注的仅仅是如何通过这个唯一标识符来识别用户,很多服务器脚本语言都有会话功能,Express也提供了会话中间件,默认是把用户信息存储在内存中,但我们既然已经有了Mongodb,不妨把会话信息存储在数据库中,方便持久维护,为了使用这个功能,我们首选要获得一个叫做connect-mongo的模块,在package.json中加入:
{
’dependencies‘: {
"connect-mongo": "2.0.0"
}
}
还需要安装express-session , 也是通过在工程目录下npm install express-session
运行npm install 更新模块,然后打开app.js,添加:
var session = require("express-session");
var MongoStore = require("connect-mongo")(session);
var settings = require("./settings");
app.use(session({
secret : settings.cookieSecret,
store : new MongoStore({
db : "microblog",
host: "127.0.0.1",
port: "27017",
url:"mongodb://localhost:27017/microblog",
})
}))