Mongoose+Node 写一个注册登录会话demo

  • MongoDB是一个面向文档的,schema无关(schema-less)的数据库,它非常适合Node.js应用以及云端部署。
    • schema无关值得是可以将任意类型的文档数据存储到集合中。
      在MongoDB中,可以将数据都看作文档,设计非常灵活,
    • MongoDB文档可以是任意深度的

MongoDB(ODM:Object Docummet Mapper)

MongoDB 一个注册登录会话demo
1、安装MongoDB

环境:OX 10.14
brew update
brew install mongodb
(执行上面两个操作的前提是安装HomeBrew)
然后出现Error:mongodb 4.0.3 is already installed这个错误,因为我以前安装过,现在问我更不更新,好吧就更新吧,但是还挺久的(捂脸)。
brew upgrade mongodb
在这里插入图片描述

2、配置mongodb

1、创建数据库文件放置的目录
默认mongodb 数据文件是放到根目录 data/db 文件夹下,如果没有这个文件,请自行创建,我建在projects/data/db。(我的理解这里只是放数据库文件的地方)
2、配置相关参数
如果你当前的环境变量还没有加入 mongod ,手动添加的环境变量中。
nano ~/.bash_profile
此时会在命令行中打开.bash_profile文件
添加mongodb安装目录到环境变量中
export PATH=/usr/local/Cellar/mongodb/2.4.9/bin:${PATH}
让环境变量马上生效, 执行下面的shell
source ~/.bash_profile
修改mongodb配置文件,配置文件默认在 /usr/local/etc 下的 mongod.conf
dbpath = /Users/yao37/projects/data/db这里就是我放数据库数据的地方
在终端输入mongo,会失败
这是以为服务器启动之前要给data/db文件写入权限chmod -R 777
3、测试一下mongoDB是否安装成功
which mongod
出现mongodb(我本地)的安装路径:/usr/local/Cellar/mongodb/4.0.3_1/bin/mongod
出现路径,说明安装成功
4、重新测试
在跟目录下执行mongo
然后出错:Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused
解决方案:
brew services start mongodb
再启动(mongo命令),成功!
可以访问http://localhost:27017/ 来验证是否成功,若出现:
在这里插入图片描述

3、用户认证的表单

1、安装模块
npm install express
npm install mongoose
npm install ejs
npm install crypto
安装表单处理和会话需要的模块
npm install body-parser
npm install cookie-parser
npm install express-session
安装日志模块和加载静态文件的中间件
npm install morgan
npm install serve-static
npm install connect-flash

2、解析一些模块的作用(其他没说明的模块在其他文章里面有讲)
connect-flash
flash 是 session 中一个用于存储信息的特殊区域。消息写入到 flash 中,在跳转目标页中显示该消息。flash 是配置 redirect 一同使用的,以确保消息在目标页面中可用。

flash 可用于一次性的消息提示,比如注册,登录页面,当你再次刷新时,flash就没有提示消息了。

安装完connect-flash之后,你还需要安装一个 express-session 模块,因为 connect-flash 是需要存储在 session 模块。
mongoose
内容有点多,直接看另一篇MongoDB &&Mongoose;
crypto
crypto模块的目的是为了提供通用的加密和哈希算法。用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢。Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口。
connect-mongo
用于mongodb会话存储

3、登录会话机制
会话(session)是一种持久网络协议,在用户(或用户代理)端和服务端之间创建关联,从而起到交换数据包的作用,session在网络协议(例如telnet或FTP)中是非常重要的部分。
为了在无状态的HTTP协议上实现会话,cookie诞生了。
cookie 是一些存储在客户端的信息,每次连接的时候由浏览器向服务器提交,服务器也向浏览器发起存储cookie的请求,依靠这样的手段服务器可以识别客户端。
通常意义上的HTTP会话就是这样实现的,即浏览器首次向服务器发起请求时,服务器生成唯一的标识符并发送给客户端浏览器,浏览器将这个唯一的标识符存储在cookie中,以后每次再发起请求,客户端浏览器都会向服务器传送这个唯一标识。
express也提供了会话中间件,默认情况下是把用户信息存储在内存中,这里我们用MongoDB把会话信息存储在数据库中,便于持久维护。
session 可以和 Redis 或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)。

4、设计逻辑
模块的说明大概这么解释了。一开始本来应该一点点顺着思路来写的,发现写出来可能文章内容太多了,所以大概在这里讲一些设计逻辑。
整个项目的文件:
在这里插入图片描述
其中,
modal中db.js、user.js用来放置mongoose模块和用户模块。db.js监听mongoose的连接,User schema会映射到mongodb中的一个叫做user的collection,它不具备操作数据库的能力。

router的index.js封装了路由的逻辑,有下面几个路由
/ get
/login get
/login post
/signup get
/signup post
/logout get
例如:

// 路由 /login post
app.get('/login',function(req,res,next){
    if (req.session && req.session.user) {
        req.flash('error','已登录');
        return res.redirect('/');
    }
    next();
});
app.get('/login', function(req,res,next) {    // 登录
    res.render('login');
});

在/login post中先判断用户是否已经登录(通过session),如果登录的话就不需要重复输入密码进行数据库查询了,直接跳转到首页(/)。

views中放置视图文件
其中message.ejs放置消息,例如注册、登录失败等情况下需要说明信息,将信息存储在res.local变量中,那么就可以直接在视图文件中使用了。消息通知是利用connect-flash,并在入口js文件中配置:

// 将flash中存入的变量存入res.locals变量中
server.use(function(req,res,next) {
    res.locals.user = req.session.user;
    res.locals.success  = req.flash('success').toString();
    res.locals.error  = req.flash('error').toString();
    next();
});

message.ejs的视图文件如下图所示:

// message.ejs
<% if (success) { %>
    <div>
      <p><%= success %></p>
    </div>
<% } %>
<% if (error) { %>
    <div>
      <p><%= error %></p>
    </div>
<% } %>

message.ejs被include在其他视图中。

setting.js文件放置mongodb连接配置:

var settings = {
    cookieSecret: 'my secret',
    db: 'form',         // 连接一个叫form的数据库
    host: 'localhost'
};
module.exports = settings;

5、demo截图
最近时间不足,所以只是做了个大概的逻辑(页面没有优化)。具体逻辑可以戳github
5.1首页:
在这里插入图片描述
5.2登录页面
在这里插入图片描述
提交之后登录失败,因为该用户尚不存在数据库中。
在这里插入图片描述
5.3 注册页面
在这里插入图片描述
注册完之后提交:
在这里插入图片描述
提交之后重定向到登录页面:
在这里插入图片描述
现在正确登录之后跳转到首页/ :
在这里插入图片描述
注意,此时login连接已经变成了logout链接。
5.4 登录之后不能再注册和登录
登录之后你在地址栏输入 http://localhost:3000/login 页面不会跳转到登录页面,而是仍然重定向到首页。
同理,登录之后不能再注册(这是基于某些场景设计的),在地址栏输入http://localhost:3000/signup 重定向到首页。

5.5 未登录状态不能访问logout路由
未登录状态不能访问logout路由,会直接重定向到登录页面
在这里插入图片描述

5.6 关于数据库
数据库如下所示,我注册了7个用户,登录时验证密码就是将输入的密码用(与注册输入时的)同一个加密方法,并把加密结果和数据库中的做比较。
在这里插入图片描述

总结:刚开始实践node,很多功能都是不完善的,只不过是设计了必要的逻辑,页面也很丑,后面的功能有时间再慢慢~
在做demo的过程中主要遇到的问题是:

  • mongodb的连接问题,最后使用mongoose解决了
  • 在访问url前做一次过滤操作(即登录了的用户访问不了注册页面等操作)这个过程遇到一个奇怪的问题,就是过滤的函数并不能用一个函数名来代替,而是一定要写一遍代码(还好这里中间函数并不是很多,还可以重复,就是看得很不舒服)
  • 遇到由于服务器返回两次消息而出错的问题,这个问题出现在回调中,应该是粗心大意,但可能在其他场景下也需要避免这种写法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值