Node+Express+MongoDB實(shí)現(xiàn)登錄注冊功能實(shí)例
注入MongoDB 依賴
var mongoose = require("mongoose");
由于需要進(jìn)行表單處理,需要用到bodyParser中間件
bodyParser模塊來做文件解析,將表單里的數(shù)據(jù)進(jìn)行格式化
var bodyParser = require("body-parser"); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));
登錄后將用戶信息保存下來,需要使用session中間件,它依賴cookieParser中間件
var cookieParser = require('cookie-parser'); var session = require('express-session'); ar mongoStore = require('connect-mongo')(session); var dbUrl = 'mongodb://localhost/express'; app.use(cookieParser()); app.use(session({ secret:'express', store: new mongoStore({ url: dbUrl, collection: 'sessions' }) }));
使用jade模板
layout.jade
doctype html html head meta(charset='utf-8') title #{title} include ./includes/head body include ./includes/header block content
head.jade
link(href='css/main.css', rel='stylesheet') link(href="/libs/bootstrap/dist/css/bootstrap.min.css" rel="external nofollow" , rel="stylesheet") script(src="/libs/jquery/dist/jquery.min.js") script(src="/libs/bootstrap/dist/js/bootstrap.min.js")
header.jade
.container .row .page-header h1 #{title} .navbar.navbar-default.navbar-fixed-bottom .container if user p.navbar-text.navbar-right span 歡迎你,#{user.name} span | a.navbar-link(href="/layout" rel="external nofollow" ) 退出登錄 else p.navbar-text.navbar-right a.navbar-link(href="/signup" rel="external nofollow" , data-toggle="modal", data-target="#signupModal") 注冊 span | a.navbar-link(href="/login" rel="external nofollow" , data-toggle="modal", data-target="#signinModal") 登錄
signup.jade
include ../layout block content form.form-horizontal( role="form", method="POST", action='/user/signup') .form-group label.col-sm-2.control-label(for="signupName") 用戶名 .col-sm-10 input#signupName.form-control(type="text", name="user[name]", placeholder="輸入用戶名") .form-group label.col-sm-2.control-label(for="signuppassword") 密碼 .col-sm-10 input#signuppassword.form-control(type="password", name="user[password]", placeholder="輸入密碼") .form-group label.col-sm-2.control-label(for="signupemail") 郵箱 .col-sm-10 input#signupemail.form-control(type="email", name="user[email]", placeholder="輸入郵箱") .form-group .col-sm-offset-2.col-sm-10 button.btn.btn-default(type="submit") 完成注冊
配置路由
登錄注冊頁面
// 注冊頁面 app.get('/signup', function (req,res) { res.render('signup', { title: '注冊' }); }); // 登錄頁面 app.get('/login', function (req,res) { res.render('login', { title: '登錄' }); });
注冊功能
// 注冊表單 app.post('/user/signup', function (req,res) { var _user = req.body.user; User.findOne({name:_user.name}, function (err, user) { if(err){ console.log(err); } if(user) { return res.redirect('/login'); } else { var user = new User(_user); user.save(function (err, user) { if(err){ console.log(err); res.redirect('/signup'); } console.log('注冊成功——用戶名:' + user); res.redirect('/login'); }); } }); });
登錄功能
// 登錄表單 app.post('/user/login', function (req,res) { var _user = req.body.user; var name = _user.name; var password = _user.password; User.findOne({name:name}, function (err, user) { if(err){ console.log(err); } if(!user) { return res.redirect('/signup'); } user.comparePassword(password, function (err, isMatch) { if (err){ console.log(err); } if (isMatch) { req.session.user = user; // 用戶名存入session中 console.log('登錄成功——用戶名: ' + user); return res.redirect('/'); } else { return res.redirect('/lgoin'); } }); }); });
退出登錄
app.get('/layout', function(req,res){ delete req.session.user; //delete app.locals.user; // 刪除全局變量user,否則點(diǎn)擊退出登錄,頁面無變化 res.redirect('/'); });
登錄注冊的數(shù)據(jù)庫操作
連接數(shù)據(jù)庫
mongoose.connect("mongodb://localhost/express"); // 連接數(shù)據(jù)庫
schema模式定義
數(shù)據(jù)的更新和查找,以及密碼加鹽
//schemas/user.js var mongoose = require('mongoose'); var bcrypt = require('bcrypt'); var SALT_WORK_FSCTOR = 10; // 計(jì)算強(qiáng)度,越大破解越困難 var UserSchema = new mongoose.Schema({ name: { unique: true, type:String }, password: String, email:String, meta: { createAt: { type: Date, default: Date.now() }, updateAt: { type: Date, default: Date.now() } } }); //每次存入數(shù)據(jù)時(shí)都進(jìn)行判斷 UserSchema.pre('save', function (next) { var user = this; if (this.isNew) { // 數(shù)據(jù)是新數(shù)據(jù) this.meta.createAt = this.meta.updateAt = Date.now(); } else { this.meta.updateAt = Date.now(); } //密碼 加鹽 bcrypt.genSalt(SALT_WORK_FSCTOR, function (err, salt) { if (err) { return next(err); } bcrypt.hash(user.password, salt, function (err, hash) { if (err) { return next(err); } user.password = hash; next(); }); }); }); UserSchema.methods = { comparePassword: function (_password, cb) { bcrypt.compare(_password, this.password, function (err, isMatch) { if (err) { return cb(err); } cb(null, isMatch); }) } }; UserSchema.statics = { fetch: function (cb) { return this .find({}) .sort('meta.updateAt') .exec(cb); }, findById: function (id, cb) { return this .findOne({_id: id}) .exec(cb) } };
module.exports = UserSchema;
model編譯模型
// models/user.js var mongoose = require('mongoose'); //模式 var UserSchema = require('../schemas/user'); //編譯模型 var User = mongoose.model('user',UserSchema); module.exports = User;
入口文件注入
//app.js var User = require('./models/user'); app.set('view engine', 'jade'); // jade模板引擎 app.set("views", "./views/pages/"); // 視圖根目錄 var serveStatic = require('serve-static'); // 靜態(tài)文件處理 app.use(serveStatic('public')); // 路徑:public
身份驗(yàn)證中間件
獲取session的用戶名,存入到locals中,暴露給視圖使用,即header.jade中可以獲取到user。
app.use(function (req, res, next) { var _user = req.session.user; app.locals.user = _user; return next(); });
以上所述是小編給大家介紹的Node+Express+MongoDB實(shí)現(xiàn)登錄注冊功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Express + Session 實(shí)現(xiàn)登錄驗(yàn)證功能
- Nodejs進(jìn)階:express+session實(shí)現(xiàn)簡易登錄身份認(rèn)證
- Node.js+Express+MySql實(shí)現(xiàn)用戶登錄注冊功能
- 用node和express連接mysql實(shí)現(xiàn)登錄注冊的實(shí)現(xiàn)代碼
- express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的方法
- express + jwt + postMan驗(yàn)證實(shí)現(xiàn)持久化登錄
- Vue+Express實(shí)現(xiàn)登錄狀態(tài)權(quán)限驗(yàn)證的示例代碼
- nodejs使用express獲取get和post傳值及session驗(yàn)證的方法
- DevExpress實(shí)現(xiàn)GridControl單元格編輯驗(yàn)證的方法
- Express實(shí)現(xiàn)登錄驗(yàn)證
相關(guān)文章
關(guān)于Node.js中Buffer的一些你可能不知道的用法
網(wǎng)上關(guān)于Node.js中Buffer用法的文章有很多,但是感覺還是不夠詳細(xì),所以這篇文章主要介紹了關(guān)于Node.js中Buffer的一些你可能不知道的用法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03Node.js+ELK日志規(guī)范的實(shí)現(xiàn)
這篇文章主要介紹了Node.js+ELK日志規(guī)范的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Node.js前后端交互實(shí)現(xiàn)用戶登陸的實(shí)踐
本文主要介紹了Node.js前后端交互實(shí)現(xiàn)用戶登陸的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Node.js利用debug模塊打印出調(diào)試日志的方法
debug日志打印模塊主要實(shí)現(xiàn)功能是帶命名空間(模塊名)、時(shí)間戳、色彩輸出日志;將日志寫入文件;瀏覽器端使用;格式化函數(shù);支持自定義方法。下面這篇文章主要介紹了Node.js利用debug模塊打印出調(diào)試日志的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04