成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

公司項(xiàng)目NODEJS實(shí)踐0.3[ mongo / session ...]

MoAir / 1294人閱讀

摘要:使用,可參考執(zhí)行退出命令,只要設(shè)置,即可。下節(jié)主要實(shí)現(xiàn)注冊時(shí)的郵件驗(yàn)證保存登錄狀態(tài)異常處理,同步異步操作全棧工程技術(shù)新群上一篇公司項(xiàng)目實(shí)踐下一篇待續(xù)

一、前言

???書接上回,我們搭建了WEB服務(wù)端路由、模板等功能,完成了register 通過ajax與后端的通信,今天主要完成數(shù)據(jù)與mongodb的存取,實(shí)現(xiàn)注冊 / 登錄 / 退出功能

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

二、db操作

???上一節(jié)我們已經(jīng)安裝過了mongo,本節(jié)主要是對其操作

1、mongoose

???nodejs對 mongo的操作,我們使用 mongoose庫

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

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

2、/root/web目錄下創(chuàng)建 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的默認(rèn)端口是 27017
            if( !err ){
                console.log( "DB == connect to mongodb" );
            } else {
                throw err;
            }
        } );

        var Schema = mongoose.Schema;

        var UserSchema = new Schema({ //創(chuàng)建User表模型,數(shù)據(jù)可據(jù)需求增減
            username: String,
            password: String,
            email: String,
            disabled: Boolean, //后面加注冊后的郵件驗(yàn)證功能
            date: Date,
            power: Number  //后面會(huì)用到權(quán)限功能  
        });

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

        function initData( data, db ){ //對參數(shù)做預(yù)處理,以防出現(xiàn)不合要求的參數(shù),后面這塊會(huì)做擴(kuò)展
            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,用于處理路由與數(shù)據(jù)存儲(chǔ)的中間邏輯,添加代碼如下
javascript        var db = require( "../db/sql" ); //添加前面定義的db操作模塊

        function addUser( req, res ){ //增加用戶
            var data = req.body; //post過來的數(shù)據(jù)在req.body里,get過來的數(shù)據(jù)在req.query里
            data.date = new Date(); //數(shù)據(jù)里增加時(shí)間
            db.addUser( data, function( err, doc ){
            if( !err ){
                res.send( { code: 0, msg: "add User Success", data: doc } );
                //對查詢結(jié)果返回,返回格式統(tǒng)一為 {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、修改上節(jié)在/root/web/routes/issue.js定義的register函數(shù)改為
javascript
function registerUser( req, res ){ user.addUser( req, res ); }

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

???再用node-dev啟動(dòng)項(xiàng)目,訪問register,提交表單,可以看到返回成功,至此我們注冊用戶成功

5、使用shell mongo

???打開shell,執(zhí)行mongo,打開mongo終端

???執(zhí)行use myDB //切換到myDB數(shù)據(jù)庫

???執(zhí)行db.User.find().pretty() //可以看到剛才我們新增的數(shù)據(jù)

6、增加登錄查詢

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

???在/root/static/module/issue 下新建 login的 js/css/img 靜態(tài)文件,添加登錄請求,如注冊。

???我們在db操作/db.sql.js里及業(yè)務(wù)處理/controls/user.js已經(jīng)增加查詢方法,只需在/routes/index.js 及 issue里增加 登錄查詢即可,這里不在列出,參考 register 流程即可。

7、session

???上一步,我們走通了注冊和登錄查詢功能,然后登錄的目的是為了根據(jù)用戶登錄與否判斷是否具備訪問某些頁面的權(quán)限。

???這里簡單說下session(后面再多帶帶詳解):網(wǎng)站保存信息或狀態(tài),頁面端常用的是cookie,而對應(yīng)服務(wù)端是session,登錄狀態(tài)需要保存服務(wù)端以防偽造頁面端。而http(后面再多帶帶詳解)是無狀態(tài)的,為使頁面端與服務(wù)端關(guān)聯(lián),生成session時(shí),同時(shí)會(huì)在cookie里寫入一個(gè)對應(yīng)的id值,如 session_sid,每次頁面與服務(wù)器的交互都會(huì)自動(dòng)帶上cookie,服務(wù)器端會(huì)據(jù)這個(gè)id查找是否有對應(yīng)的session保存,從而形成狀態(tài)保存。

???這里我們也使用第三方庫 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狀態(tài)是否是true
                    res.redirect("/login"); //不是則跳轉(zhuǎn)到登錄頁
                } else {
                    next(); //為true,則繼續(xù)執(zhí)行其請求
                }
            })
            app.get( "/", function( req, res ){
                issue.index( req, res );
            });
        …

???上面的代碼是對所有的頁面做了限制,都必須是登錄的狀態(tài)才能訪問,所以前端要先有注冊成功的賬號(hào),這樣的權(quán)限設(shè)置當(dāng)然是不對的,我們只是做下測試。

???打開/root/web/controls/user.js,在findUser函數(shù)下新增如下代碼

javascript        …
        function findUser( req, res ){
        var data = req.body;
            db.findUser( data, function( err, doc ){
                if( !err ){
                    if( doc ){ //如果登錄有查找結(jié)果
                        req.session.status = true;        //則session里記錄狀態(tài)為true
                    }
                    res.send(  { code: 0, msg: "find User Success", data: doc }  );
                }
            })
        }
        …

???再打開站點(diǎn)測試,發(fā)現(xiàn),無論是訪問index 還是 register都是自動(dòng)跳轉(zhuǎn)login,登錄信息成功后,index和register都可以訪問了,查看cookies里的信息,會(huì)看到 自動(dòng)生成的connect.sid(名稱可能不同),就是保存關(guān)聯(lián)session的。手動(dòng)刪除connect.sid,所有頁面又會(huì)都跳轉(zhuǎn)到 login。

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

???執(zhí)行退出命令,只要設(shè)置req.session.status = false,即可。

8、權(quán)限設(shè)置

???上一步,增加了頁面請求對權(quán)限登錄的驗(yàn)證,但是驗(yàn)證只是針對某些頁面的,我們把需要驗(yàn)證的路徑羅列下來。

???在/web/config下新增 privilege.js,用來羅列權(quán)限表,我們新增幾個(gè)用戶管理頁面,用來表示權(quán)限需要

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

???修改 /root/web/routes/index.js,引入/web/config/privilege.js,修改驗(yàn)證是否登錄的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 ] 判斷該路徑是否需要登錄權(quán)限
                if( req.method == "GET" ){ //如果是get請求
                    res.redirect("/login"); 則執(zhí)行跳轉(zhuǎn)
                } else { //其它請求,基本都是POST,是不能直接redirect
                    res.send( { code: 1001, msg: "need you to log in"}); //則返回錯(cuò)誤碼,提示需要登錄
                }
            } else {
                next();
            }
        })
        …

???在web/routes 、web/views、status/module,新增對應(yīng)的用戶頁面,user/blog,user/info,user/center,添加時(shí)注意文件夾的命名及細(xì)分。

???清除cookie,再訪問 index 、register都是可以的,而user下的三個(gè)頁面都需要登錄。

9、頁面登錄狀態(tài)顯示 及 退出

???在/root/static/public/js 下新建 all.js,用于所有頁面都要執(zhí)行js

???將頁面據(jù)cookies判斷登錄狀態(tài)的js寫入,以便頁面導(dǎo)航上 顯示 登錄 或 退出,通過requirejs,在每個(gè)頁面引入。

???退出,即給退出鏈接加一個(gè)get請求,/logout,在/routes/index.js里,添加logout

javascript         ...
        app.get("/logout", function( req, res ){
            req.session.status = false; //設(shè)置session狀態(tài)為未登錄
            res.setHeader("Set-Cookie","username=null;" ); //清除cookie
            res.redirect( "/" ); //跳轉(zhuǎn)到首頁
        })
        ...

三、至此我們完成了簡單完成了注冊及登錄功能流程。

???本節(jié)我們主要完成:

???1、通過mongoose來操作mongo,完成數(shù)據(jù)增加和查詢

???2、通過session保存登錄狀態(tài)

???3、完成注冊 / 登錄 / 退出

???4、增加權(quán)限判斷

???本節(jié)我們雖然使用了session來記錄登錄狀態(tài),但實(shí)際使用時(shí)還是會(huì)有些問題,session是保存在本項(xiàng)目里的,如果上線后web服務(wù)端需要用多臺(tái)計(jì)算機(jī)來負(fù)載,則狀態(tài)不能共享??梢圆捎么罱?yàn)證服務(wù)器,即多帶帶配置一個(gè)服務(wù)器來執(zhí)行驗(yàn)證功能,也可以使用redis來保存登錄狀態(tài)。下節(jié)我們將使用redis來保存登錄狀態(tài)。

???下節(jié)主要實(shí)現(xiàn):

???1、注冊時(shí)的郵件驗(yàn)證

???2、redis保存登錄狀態(tài)

???3、nodejs異常處理,同步 and 異步

???4、git操作

全棧工程 - 技術(shù)新Q群:435485569 上一篇:公司項(xiàng)目NODEJS實(shí)踐0.2[ express, ajax.. ] 下一篇:待續(xù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/18774.html

相關(guān)文章

  • Express 實(shí)戰(zhàn)(八):利用 MongoDB 進(jìn)行數(shù)據(jù)持久化

    摘要:在使用過程中我們可以通過增加哈希次數(shù)來提高數(shù)據(jù)的安全性。當(dāng)然,對密碼的哈希操作應(yīng)該在保存數(shù)據(jù)之前。 showImg(https://segmentfault.com/img/remote/1460000010821081); 毫無疑問,幾乎所有的應(yīng)用都會(huì)涉及到數(shù)據(jù)存儲(chǔ)。但是 Express 框架本身只能通過程序變量來保存數(shù)據(jù),它并不提供數(shù)據(jù)持久化功能。而僅僅通過內(nèi)存來保存數(shù)據(jù)是無法應(yīng)對...

    yanbingyun1990 評論0 收藏0
  • 公司項(xiàng)目NODEJS實(shí)踐0.1[ ubuntu,nodejs,nginx...]

    摘要:創(chuàng)建成功后進(jìn)入文件夾執(zhí)行執(zhí)行作用創(chuàng)建文件,維護(hù)項(xiàng)目的依賴文件解釋創(chuàng)建文件執(zhí)行作用用系統(tǒng)的編輯器打開文件。我的技術(shù)新群上一篇前后端分離項(xiàng)目實(shí)踐分析下一篇公司項(xiàng)目實(shí)踐 一、前言 前端如何獨(dú)立用nodeJs實(shí)現(xiàn)一個(gè)簡單的注冊、登錄功能,是不是只用nodejs+sql就可以了?其實(shí)是可以實(shí)現(xiàn),但離實(shí)際應(yīng)用還有距離,那要怎么做才是實(shí)際可用的。 網(wǎng)上有很多nodeJs的示例,包括和 sql /...

    cppprimer 評論0 收藏0
  • nodejs+mongodb構(gòu)建一個(gè)簡單登錄注冊功能

    摘要:搭建簡單登錄注冊還是我又來了近來突然對數(shù)據(jù)庫和后臺(tái)有點(diǎn)感興趣就開始了漫長的學(xué)習(xí)之路想想自己只是一個(gè)前端只會(huì)斯科瑞普所以就開始看看著看著突然發(fā)現(xiàn)和更配哦遂就開了我的之路由于我的表達(dá)能力有限下面的文章可能寫的不是那么詳細(xì)有看不懂的可以去我上看源 nodejs+mongodb搭建簡單登錄注冊 biu!biu!biu!還是我又來了!!! 近來突然對數(shù)據(jù)庫和后臺(tái)有點(diǎn)感興趣,就開始了漫長的學(xué)習(xí)之...

    yibinnn 評論0 收藏0
  • nodejs+mongodb構(gòu)建一個(gè)簡單登錄注冊功能

    摘要:搭建簡單登錄注冊還是我又來了近來突然對數(shù)據(jù)庫和后臺(tái)有點(diǎn)感興趣就開始了漫長的學(xué)習(xí)之路想想自己只是一個(gè)前端只會(huì)斯科瑞普所以就開始看看著看著突然發(fā)現(xiàn)和更配哦遂就開了我的之路由于我的表達(dá)能力有限下面的文章可能寫的不是那么詳細(xì)有看不懂的可以去我上看源 nodejs+mongodb搭建簡單登錄注冊 biu!biu!biu!還是我又來了!!! 近來突然對數(shù)據(jù)庫和后臺(tái)有點(diǎn)感興趣,就開始了漫長的學(xué)習(xí)之...

    BoYang 評論0 收藏0
  • [node.js]《Nodejs開發(fā)指南》 微博項(xiàng)目實(shí)現(xiàn)

    摘要:開發(fā)指南原有的下載地址失效了,想要的朋友可以戳我項(xiàng)目完整代碼一個(gè)基于和的簡單微博項(xiàng)目,具體描述詳見開發(fā)指南。改為其中書中使用來實(shí)現(xiàn)服務(wù)器返回信息的顯示,但是該方法在很久之前被廢除。 Nodejs開發(fā)指南PDF(原有的下載地址失效了,想要pdf的朋友可以戳我): http://wenku.baidu.com/link?url=RSy6donQq0guPBwwFZiWjPGJzzINmui...

    Lowky 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<