欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node+Express+MongoDB實(shí)現(xiàn)登錄注冊功能實(shí)例

 更新時(shí)間:2017年04月23日 15:56:42   作者:m0_37068028  
這篇文章主要介紹了Node+Express+MongoDB實(shí)現(xiàn)登錄注冊功能,需要的朋友可以參考下

注入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)站的支持!

相關(guān)文章

  • npm的lock機(jī)制解析

    npm的lock機(jī)制解析

    這篇文章主要介紹了npm的lock機(jī)制解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • nodejs實(shí)現(xiàn)簡單的gulp打包

    nodejs實(shí)現(xiàn)簡單的gulp打包

    因?yàn)橹耙恢庇腥私o我推薦gulp,說他這里好哪里好的。實(shí)際上對我來說夠用就行。grunt熟悉以后實(shí)際上他的配置也不難,說到效率的話確實(shí)是個(gè)問題,尤其項(xiàng)目大了以后,目前位置遇到的項(xiàng)目都還可以忍受。不過不管怎么說,需要親自用過gulp之后才能品評他和grunt之間的優(yōu)劣。
    2017-12-12
  • 關(guān)于Node.js中Buffer的一些你可能不知道的用法

    關(guān)于Node.js中Buffer的一些你可能不知道的用法

    網(wǎng)上關(guān)于Node.js中Buffer用法的文章有很多,但是感覺還是不夠詳細(xì),所以這篇文章主要介紹了關(guān)于Node.js中Buffer的一些你可能不知道的用法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Nodejs之TCP服務(wù)端與客戶端聊天程序詳解

    Nodejs之TCP服務(wù)端與客戶端聊天程序詳解

    這篇文章主要為大家詳細(xì)介紹了Nodejs之TCP服務(wù)端與客戶端聊天程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Node.js+ELK日志規(guī)范的實(shí)現(xiàn)

    Node.js+ELK日志規(guī)范的實(shí)現(xiàn)

    這篇文章主要介紹了Node.js+ELK日志規(guī)范的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Node.js前后端交互實(shí)現(xiàn)用戶登陸的實(shí)踐

    Node.js前后端交互實(shí)現(xiàn)用戶登陸的實(shí)踐

    本文主要介紹了Node.js前后端交互實(shí)現(xiàn)用戶登陸的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 使用Node操作文件夾的常用API

    使用Node操作文件夾的常用API

    這篇文章我們將學(xué)習(xí)Node對文件夾的操作,當(dāng)我們學(xué)習(xí)完文件夾的操作后結(jié)合文件的操作我們就可以真正的通過Node在日常的工作生活中解決許多和文件相關(guān)的問題,這篇文章我們將首先講解文件夾操作的幾個(gè)API,然后完成一下最常見的文件夾遞歸的操作,需要的朋友可以參考下
    2024-08-08
  • 實(shí)例詳解Node.js 函數(shù)

    實(shí)例詳解Node.js 函數(shù)

    這篇文章主要介紹了Node.js 函數(shù) ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • Node.js利用debug模塊打印出調(diào)試日志的方法

    Node.js利用debug模塊打印出調(diào)試日志的方法

    debug日志打印模塊主要實(shí)現(xiàn)功能是帶命名空間(模塊名)、時(shí)間戳、色彩輸出日志;將日志寫入文件;瀏覽器端使用;格式化函數(shù);支持自定義方法。下面這篇文章主要介紹了Node.js利用debug模塊打印出調(diào)試日志的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • 基于nodejs實(shí)現(xiàn)微信支付功能

    基于nodejs實(shí)現(xiàn)微信支付功能

    這篇文章主要為大家詳細(xì)介紹了基于nodejs實(shí)現(xiàn)微信支付功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論