摘要:使用,可參考執(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
摘要:在使用過程中我們可以通過增加哈希次數(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)對...
摘要:創(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 /...
摘要:搭建簡單登錄注冊還是我又來了近來突然對數(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í)之...
摘要:搭建簡單登錄注冊還是我又來了近來突然對數(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í)之...
摘要:開發(fā)指南原有的下載地址失效了,想要的朋友可以戳我項(xiàng)目完整代碼一個(gè)基于和的簡單微博項(xiàng)目,具體描述詳見開發(fā)指南。改為其中書中使用來實(shí)現(xiàn)服務(wù)器返回信息的顯示,但是該方法在很久之前被廢除。 Nodejs開發(fā)指南PDF(原有的下載地址失效了,想要pdf的朋友可以戳我): http://wenku.baidu.com/link?url=RSy6donQq0guPBwwFZiWjPGJzzINmui...
閱讀 3594·2021-09-22 10:52
閱讀 1604·2021-09-09 09:34
閱讀 2007·2021-09-09 09:33
閱讀 771·2019-08-30 15:54
閱讀 2691·2019-08-29 11:15
閱讀 730·2019-08-26 13:37
閱讀 1682·2019-08-26 12:11
閱讀 2989·2019-08-26 12:00