Node+Express+MongoDB實現(xiàn)登錄注冊功能實例
注入MongoDB 依賴
var mongoose = require("mongoose");
由于需要進行表單處理,需要用到bodyParser中間件
bodyParser模塊來做文件解析,將表單里的數(shù)據(jù)進行格式化
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,否則點擊退出登錄,頁面無變化
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; // 計算強度,越大破解越困難
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ù)時都進行判斷
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
身份驗證中間件
獲取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實現(xiàn)登錄注冊功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
- Express + Session 實現(xiàn)登錄驗證功能
- Nodejs進階:express+session實現(xiàn)簡易登錄身份認證
- Node.js+Express+MySql實現(xiàn)用戶登錄注冊功能
- 用node和express連接mysql實現(xiàn)登錄注冊的實現(xiàn)代碼
- express框架中使用jwt實現(xiàn)驗證的方法
- express + jwt + postMan驗證實現(xiàn)持久化登錄
- Vue+Express實現(xiàn)登錄狀態(tài)權限驗證的示例代碼
- nodejs使用express獲取get和post傳值及session驗證的方法
- DevExpress實現(xiàn)GridControl單元格編輯驗證的方法
- Express實現(xiàn)登錄驗證

