资讯专栏INFORMATION COLUMN

公司项目NODEJS实践0.3[ mongo / session ...]

MoAir / 1282人阅读

摘要:使用,可参考执行退出命令,只要设置,即可。下节主要实现注册时的邮件验证保存登录状态异常处理,同步异步操作全栈工程技术新群上一篇公司项目实践下一篇待续

一、前言

⋅⋅⋅书接上回,我们搭建了WEB服务端路由、模板等功能,完成了register 通过ajax与后端的通信,今天主要完成数据与mongodb的存取,实现注册 / 登录 / 退出功能

⋅⋅⋅DEMO GIT https://github.com/xiaolulu/mynodejs.git

二、db操作

⋅⋅⋅上一节我们已经安装过了mongo,本节主要是对其操作

1、mongoose

⋅⋅⋅nodejs对 mongo的操作,我们使用 mongoose库

⋅⋅⋅在package.json添加mongoose,并npm install

⋅⋅⋅使用参考http://www.upopen.cn/article/info?id=559688a7f0e6e0665b000004

2、/root/web目录下创建 db/sql.js,用于对mongoose的操作,添加如下代码
javascript        var mongoose = require( "mongoose"  ); //引用模块
        mongoose.connect( "mongodb://127.0.0.1/myDB", function( err ){
            //连接mongoose,连接本地127.0.0.1,mongo的默认端口是 27017
            if( !err ){
                console.log( "DB == connect to mongodb" );
            } else {
                throw err;
            }
        } );

        var Schema = mongoose.Schema;

        var UserSchema = new Schema({ //创建User表模型,数据可据需求增减
            username: String,
            password: String,
            email: String,
            disabled: Boolean, //后面加注册后的邮件验证功能
            date: Date,
            power: Number  //后面会用到权限功能  
        });

        var UserModel = mongoose.model( "User", UserSchema, "User" );

        function initData( data, db ){ //对参数做预处理,以防出现不合要求的参数,后面这块会做扩展
            var query = {};
            for( var key in data ){
                if( db.tree[ key ] ){
                    query[ key ] = data[ key ];
                }
            }
            return query;
        }

        function addUser( data, cb ){ //增加用户
            data = initData( data, UserSchema );
            ( new UserModel( data )).save( function( err, doc  ){
                cb( err, doc );
            })
        }
        function findUser( data, cb ){ //查找用户
            data = initData( data, UserSchema );
            UserModel.findOne( data ).exec( function( err, doc ){
                cb( err, doc );
            })
        }

        module.exports = {
            addUser: addUser,
            findUser: findUser
        }

3、在 /root/web下新建controls/user.js,用于处理路由与数据存储的中间逻辑,添加代码如下
javascript        var db = require( "../db/sql" ); //添加前面定义的db操作模块

        function addUser( req, res ){ //增加用户
            var data = req.body; //post过来的数据在req.body里,get过来的数据在req.query里
            data.date = new Date(); //数据里增加时间
            db.addUser( data, function( err, doc ){
            if( !err ){
                res.send( { code: 0, msg: "add User Success", data: doc } );
                //对查询结果返回,返回格式统一为 {code: 返回码, msg: 返回描述, data: 返回值}
                }
            })
        }

        function findUser( req, res ){ //查找用户
            var data = req.body;
            db.addUser( data, function( err, doc ){
                if( !err ){
                    res.send(  { code: 0, msg: "find User Success", data: doc }  );
                }
            })
        }

        module.exports = {
            addUser: addUser,
            findUser: findUser
        }
    4、修改上节在/root/web/routes/issue.js定义的register函数改为
javascript
function registerUser( req, res ){ user.addUser( req, res ); }

⋅⋅⋅并增加 /web/controls/user.js的引用

⋅⋅⋅再用node-dev启动项目,访问register,提交表单,可以看到返回成功,至此我们注册用户成功

5、使用shell mongo

⋅⋅⋅打开shell,执行mongo,打开mongo终端

⋅⋅⋅执行use myDB //切换到myDB数据库

⋅⋅⋅执行db.User.find().pretty() //可以看到刚才我们新增的数据

6、增加登录查询

⋅⋅⋅在/root/web/views/issue下新建login.ejs,添加登录form。

⋅⋅⋅在/root/static/module/issue 下新建 login的 js/css/img 静态文件,添加登录请求,如注册。

⋅⋅⋅我们在db操作/db.sql.js里及业务处理/controls/user.js已经增加查询方法,只需在/routes/index.js 及 issue里增加 登录查询即可,这里不在列出,参考 register 流程即可。

7、session

⋅⋅⋅上一步,我们走通了注册和登录查询功能,然后登录的目的是为了根据用户登录与否判断是否具备访问某些页面的权限。

⋅⋅⋅这里简单说下session(后面再多带带详解):网站保存信息或状态,页面端常用的是cookie,而对应服务端是session,登录状态需要保存服务端以防伪造页面端。而http(后面再多带带详解)是无状态的,为使页面端与服务端关联,生成session时,同时会在cookie里写入一个对应的id值,如 session_sid,每次页面与服务器的交互都会自动带上cookie,服务器端会据这个id查找是否有对应的session保存,从而形成状态保存。

⋅⋅⋅这里我们也使用第三方库 express-session,安装同 mongoose

⋅⋅⋅在 /root/web/routes/index.js里引入 express-session,并新增app.use如下

javascript        var issue = require( "./issue" ),
              session = require( "express-session" ); //添加 express-session引用
        exports.all = function( app ){
            app.use( session({ //配置session
                resave: false,
                saveUninitialized: false,
                secret: "upopen"
            }))
            app.use( function( req, res, next){
                if( req.path != "/login" && !req.session.status ){ //判断session状态是否是true
                    res.redirect("/login"); //不是则跳转到登录页
                } else {
                    next(); //为true,则继续执行其请求
                }
            })
            app.get( "/", function( req, res ){
                issue.index( req, res );
            });
        …

⋅⋅⋅上面的代码是对所有的页面做了限制,都必须是登录的状态才能访问,所以前端要先有注册成功的账号,这样的权限设置当然是不对的,我们只是做下测试。

⋅⋅⋅打开/root/web/controls/user.js,在findUser函数下新增如下代码

javascript        …
        function findUser( req, res ){
        var data = req.body;
            db.findUser( data, function( err, doc ){
                if( !err ){
                    if( doc ){ //如果登录有查找结果
                        req.session.status = true;        //则session里记录状态为true
                    }
                    res.send(  { code: 0, msg: "find User Success", data: doc }  );
                }
            })
        }
        …

⋅⋅⋅再打开站点测试,发现,无论是访问index 还是 register都是自动跳转login,登录信息成功后,index和register都可以访问了,查看cookies里的信息,会看到 自动生成的connect.sid(名称可能不同),就是保存关联session的。手动删除connect.sid,所有页面又会都跳转到 login。

⋅⋅⋅cookie使用,可参考 http://www.upopen.cn/article/info?id=559e2cbda46ee1885f000002

⋅⋅⋅执行退出命令,只要设置req.session.status = false,即可。

8、权限设置

⋅⋅⋅上一步,增加了页面请求对权限登录的验证,但是验证只是针对某些页面的,我们把需要验证的路径罗列下来。

⋅⋅⋅在/web/config下新增 privilege.js,用来罗列权限表,我们新增几个用户管理页面,用来表示权限需要

javascript
module.exports = { "/user/center" : 1, "/user/info": 1, "/user/blog": 1 }

⋅⋅⋅修改 /root/web/routes/index.js,引入/web/config/privilege.js,修改验证是否登录的app.use

javascript        …
        var privilege = require( "../config/privilege" );
        …
        app.use( function( req, res, next){
            if( privilege[ req.path ] && req.path != "/login" && !req.session.status ){
                //privilege[ req.path ] 判断该路径是否需要登录权限
                if( req.method == "GET" ){ //如果是get请求
                    res.redirect("/login"); 则执行跳转
                } else { //其它请求,基本都是POST,是不能直接redirect
                    res.send( { code: 1001, msg: "need you to log in"}); //则返回错误码,提示需要登录
                }
            } else {
                next();
            }
        })
        …

⋅⋅⋅在web/routes 、web/views、status/module,新增对应的用户页面,user/blog,user/info,user/center,添加时注意文件夹的命名及细分。

⋅⋅⋅清除cookie,再访问 index 、register都是可以的,而user下的三个页面都需要登录。

9、页面登录状态显示 及 退出

⋅⋅⋅在/root/static/public/js 下新建 all.js,用于所有页面都要执行js

⋅⋅⋅将页面据cookies判断登录状态的js写入,以便页面导航上 显示 登录 或 退出,通过requirejs,在每个页面引入。

⋅⋅⋅退出,即给退出链接加一个get请求,/logout,在/routes/index.js里,添加logout

javascript         ...
        app.get("/logout", function( req, res ){
            req.session.status = false; //设置session状态为未登录
            res.setHeader("Set-Cookie","username=null;" ); //清除cookie
            res.redirect( "/" ); //跳转到首页
        })
        ...

三、至此我们完成了简单完成了注册及登录功能流程。

⋅⋅⋅本节我们主要完成:

⋅⋅⋅1、通过mongoose来操作mongo,完成数据增加和查询

⋅⋅⋅2、通过session保存登录状态

⋅⋅⋅3、完成注册 / 登录 / 退出

⋅⋅⋅4、增加权限判断

⋅⋅⋅本节我们虽然使用了session来记录登录状态,但实际使用时还是会有些问题,session是保存在本项目里的,如果上线后web服务端需要用多台计算机来负载,则状态不能共享。可以采用搭建验证服务器,即多带带配置一个服务器来执行验证功能,也可以使用redis来保存登录状态。下节我们将使用redis来保存登录状态。

⋅⋅⋅下节主要实现:

⋅⋅⋅1、注册时的邮件验证

⋅⋅⋅2、redis保存登录状态

⋅⋅⋅3、nodejs异常处理,同步 and 异步

⋅⋅⋅4、git操作

全栈工程 - 技术新Q群:435485569 上一篇:公司项目NODEJS实践0.2[ express, ajax.. ] 下一篇:待续

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18774.html

相关文章

  • Express 实战(八):利用 MongoDB 进行数据持久化

    摘要:在使用过程中我们可以通过增加哈希次数来提高数据的安全性。当然,对密码的哈希操作应该在保存数据之前。 showImg(https://segmentfault.com/img/remote/1460000010821081); 毫无疑问,几乎所有的应用都会涉及到数据存储。但是 Express 框架本身只能通过程序变量来保存数据,它并不提供数据持久化功能。而仅仅通过内存来保存数据是无法应对...

    yanbingyun1990 评论0 收藏0
  • 公司项目NODEJS实践0.1[ ubuntu,nodejs,nginx...]

    摘要:创建成功后进入文件夹执行执行作用创建文件,维护项目的依赖文件解释创建文件执行作用用系统的编辑器打开文件。我的技术新群上一篇前后端分离项目实践分析下一篇公司项目实践 一、前言 前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。 网上有很多nodeJs的示例,包括和 sql /...

    cppprimer 评论0 收藏0
  • nodejs+mongodb构建一个简单登录注册功能

    摘要:搭建简单登录注册还是我又来了近来突然对数据库和后台有点感兴趣就开始了漫长的学习之路想想自己只是一个前端只会斯科瑞普所以就开始看看着看着突然发现和更配哦遂就开了我的之路由于我的表达能力有限下面的文章可能写的不是那么详细有看不懂的可以去我上看源 nodejs+mongodb搭建简单登录注册 biu!biu!biu!还是我又来了!!! 近来突然对数据库和后台有点感兴趣,就开始了漫长的学习之...

    yibinnn 评论0 收藏0
  • nodejs+mongodb构建一个简单登录注册功能

    摘要:搭建简单登录注册还是我又来了近来突然对数据库和后台有点感兴趣就开始了漫长的学习之路想想自己只是一个前端只会斯科瑞普所以就开始看看着看着突然发现和更配哦遂就开了我的之路由于我的表达能力有限下面的文章可能写的不是那么详细有看不懂的可以去我上看源 nodejs+mongodb搭建简单登录注册 biu!biu!biu!还是我又来了!!! 近来突然对数据库和后台有点感兴趣,就开始了漫长的学习之...

    BoYang 评论0 收藏0
  • [node.js]《Nodejs开发指南》 微博项目实现

    摘要:开发指南原有的下载地址失效了,想要的朋友可以戳我项目完整代码一个基于和的简单微博项目,具体描述详见开发指南。改为其中书中使用来实现服务器返回信息的显示,但是该方法在很久之前被废除。 Nodejs开发指南PDF(原有的下载地址失效了,想要pdf的朋友可以戳我): http://wenku.baidu.com/link?url=RSy6donQq0guPBwwFZiWjPGJzzINmui...

    Lowky 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<