摘要:使用,可參考執行退出命令,只要設置,即可。下節主要實現注冊時的郵件驗證保存登錄狀態異常處理,同步異步操作全棧工程技術新群上一篇公司項目實踐下一篇待續
一、前言
???書接上回,我們搭建了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.. ] 下一篇:待續文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18774.html
摘要:在使用過程中我們可以通過增加哈希次數來提高數據的安全性。當然,對密碼的哈希操作應該在保存數據之前。 showImg(https://segmentfault.com/img/remote/1460000010821081); 毫無疑問,幾乎所有的應用都會涉及到數據存儲。但是 Express 框架本身只能通過程序變量來保存數據,它并不提供數據持久化功能。而僅僅通過內存來保存數據是無法應對...
摘要:創建成功后進入文件夾執行執行作用創建文件,維護項目的依賴文件解釋創建文件執行作用用系統的編輯器打開文件。我的技術新群上一篇前后端分離項目實踐分析下一篇公司項目實踐 一、前言 前端如何獨立用nodeJs實現一個簡單的注冊、登錄功能,是不是只用nodejs+sql就可以了?其實是可以實現,但離實際應用還有距離,那要怎么做才是實際可用的。 網上有很多nodeJs的示例,包括和 sql /...
摘要:搭建簡單登錄注冊還是我又來了近來突然對數據庫和后臺有點感興趣就開始了漫長的學習之路想想自己只是一個前端只會斯科瑞普所以就開始看看著看著突然發現和更配哦遂就開了我的之路由于我的表達能力有限下面的文章可能寫的不是那么詳細有看不懂的可以去我上看源 nodejs+mongodb搭建簡單登錄注冊 biu!biu!biu!還是我又來了!!! 近來突然對數據庫和后臺有點感興趣,就開始了漫長的學習之...
摘要:搭建簡單登錄注冊還是我又來了近來突然對數據庫和后臺有點感興趣就開始了漫長的學習之路想想自己只是一個前端只會斯科瑞普所以就開始看看著看著突然發現和更配哦遂就開了我的之路由于我的表達能力有限下面的文章可能寫的不是那么詳細有看不懂的可以去我上看源 nodejs+mongodb搭建簡單登錄注冊 biu!biu!biu!還是我又來了!!! 近來突然對數據庫和后臺有點感興趣,就開始了漫長的學習之...
摘要:開發指南原有的下載地址失效了,想要的朋友可以戳我項目完整代碼一個基于和的簡單微博項目,具體描述詳見開發指南。改為其中書中使用來實現服務器返回信息的顯示,但是該方法在很久之前被廢除。 Nodejs開發指南PDF(原有的下載地址失效了,想要pdf的朋友可以戳我): http://wenku.baidu.com/link?url=RSy6donQq0guPBwwFZiWjPGJzzINmui...
閱讀 3561·2021-09-22 10:52
閱讀 1588·2021-09-09 09:34
閱讀 1990·2021-09-09 09:33
閱讀 758·2019-08-30 15:54
閱讀 2598·2019-08-29 11:15
閱讀 713·2019-08-26 13:37
閱讀 1667·2019-08-26 12:11
閱讀 2975·2019-08-26 12:00