1. 程式人生 > >node.js(node.js+mongoose小案例)_實現簡單的註冊登錄退出

node.js(node.js+mongoose小案例)_實現簡單的註冊登錄退出

搭建 temp for ssi return nic -a cnpm gis

一、前言

通過node.js基本知識對node.js基本知識的一個簡單應用

1、註冊

2、登錄

3、退出

二、基本內容

1、項目結構搭建如圖所示

技術分享圖片

2、這個小案列中用到了art-template子模板以及模板的繼承 可以參考官網:art-template.org

發現很多網站的頁面的頭部和尾部都是一樣的,所以我們可以將頭部和尾部提取出來,用art-template子模板,弄到一個單獨頁面中,其他頁面繼承這個頁面

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>{{block ‘title‘}}默認標題{{/
block}}</title> <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css"> {{block ‘head‘}}{{/block}} </head> <body> {{include ‘../_partials/header.html‘}} <!--用子模板引入頭部--> {{block ‘body‘}}{{/block}} {{include ‘../_partials/footer.html‘}} <!--用子模板引入尾部--> <script src="/node_modules/jquery/dist/jquery.js"
></script> <script src="/node_modules/bootstrap/dist/js/bootstrap.js"></script> {{block ‘script‘}}{{/block}} </body> </html>

3、先安裝依賴包快速搭建一個服務:

express

express-art-template

path :可以幫助我們操作路徑,這裏如果我們的項目放到別人的電腦上,如果用原來的方法就可能存在路徑找不到的情況

art-template

var express  = require(‘express‘)
//引入path包
var path = require(‘path‘)
var app = new express();

//配置express-art-template
app.engine(‘html‘, require(‘express-art-template‘))

//開放靜態資源
app.use(‘/public/‘, express.static(path.join(__dirname, ‘./public/‘)))
app.use(‘/node_modules/‘, express.static(path.join(__dirname, ‘./node_modules/‘)))


app.get(‘/‘, function (req, res){
   res.render(‘index.html‘)
})

app.listen(5000, function (){
    console.log(‘server‘)
})

4、設計路由

路徑

方法

Get參數

Post參數

是否需要登錄

備註

/

GET

渲染首頁

/register

GET

渲染註冊頁

/register

POST

Uername,password,nickname

處理註冊信息

/login

GET

渲染登錄頁

/login

post

Username,password

處理登錄請求

/logout

get

退出登錄

5、將路由寫在單獨的一個模塊裏面

(1)搭好路由殼子

var express = require(‘express‘)

var router = express.Router()
//渲染首頁
router.get(‘/‘,function (req, res) {

})

//渲染註冊頁
router.get(‘/register‘,function (req, res) {

})
//處理註冊請求
router.post(‘/register‘,function (req, res) {

})
//渲染登錄頁

router.get(‘/login‘,function (req, res) {

})
//處理登錄頁
router.post(‘/login‘,function (req, res) {

})
//退出
router.get(‘/logout‘,function (req, res) {

})

//掛載導出
module.exports = router

(2)app.js中引入router.js

//引入
var router = require(‘./router‘)
//使用
app.use(router)

6、設計mongose數據庫模型

(1)註冊的時候需要用到mongodb數據庫

安裝:cnpm install mongoose

引入:var mongoose = require("mongoose")

開啟數據庫:mongo

(2)根據可能顯示的用戶信息設計數據庫模型,並且將這個模型放到單獨的一個models目錄下面

技術分享圖片
var mongoose = require(‘mongoose‘)

// 連接數據庫
mongoose.connect(‘mongodb://localhost/test‘, { useMongoClient: true })

var Schema = mongoose.Schema

var userSchema = new Schema({
  email: {
    type: String,
    required: true
  },
  nickname: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  created_time: {
    type: Date,
    // 註意:這裏不要寫 Date.now() 因為會即刻調用
    // 這裏直接給了一個方法:Date.now
    // 當你去 new Model 的時候,如果你沒有傳遞 create_time ,則 mongoose 就會調用 default 指定的Date.now 方法,使用其返回值作為默認值
    default: Date.now
  },
  last_modified_time: {
    type: Date,
    default: Date.now
  },
  avatar: {
    type: String,
    default: ‘/public/img/avatar-default.png‘
  },
  bio: {
    type: String,
    default: ‘‘
  },
  gender: {
    type: Number,
    enum: [-1, 0, 1],
    default: -1
  },
  birthday: {
    type: Date
  },
  status: {
    type: Number,
    // 0 沒有權限限制
    // 1 不可以評論
    // 2 不可以登錄
    enum: [0, 1, 2],
    default: 0
  }
})

module.exports = mongoose.model(‘User‘, userSchema)
數據庫模型

(3)在router.js中引入數據庫

 var User = require(‘./models/user‘)

7、數據庫模型設計好了之後處理註冊事件

註冊響應主要包含以下幾個邏輯

(1)當用戶發送get請求的時候會跳轉到註冊頁面,

(2)用戶輸入註冊信息,輸入的註冊信息會和數據庫中的信息進行查找對比

(3)如果數據庫中存在這個用戶信息,則提示用戶 “用戶名已存在”

(4)如果數據庫中不存在這用戶信息,則可以註冊,並將信息保存在session中

(5)註冊完成之後頁面跳到首頁,並且在頁面右上角顯示用戶名, 此時登錄/註冊按鈕隱藏

(1)點擊註冊的時候跳轉到註冊頁面

router.get(‘/register‘,function (req, res) {
  res.render(‘register.html‘)
})

(2)客戶端發送ajax請求,

$(‘#register-form‘).on(‘submit‘, function (e){
  //將提交的表單數據鍵值對序列化可以提交的字符串
   var formData = $(this).serialize()

   $.ajax({
   url: ‘/register‘,
   type: ‘post‘,
   data: formData,
   dataType: ‘json‘,
   success: function (data) {
   var err_code = data.err_code
   if(err_code === 0) {
       //如果註冊成功,則進行表單重定向
       window.location.href(‘/‘)

      }else if(err_code === 1) {
       window.alert(‘郵箱已存在!‘)

      } else if (err_code === 500) {
            window.alert(‘服務器忙,請稍後重試!‘)
      }
    }
   })
})

(3)服務端接受到客戶端提交過來的數據,將受到的數據到mongose數據庫中查詢

router.post(‘/register‘, function (req,  res) {
   //保存收到的數據
   var body = req.body
   //查詢
   User.findOne({
   
   $or: [
       { email: body.email},
       { nickname: body.nickname}

           ]
   }, function (err,  data) {
    
   //判斷
   if(err) {
      //這裏一定要響應json格式的字符串,客戶端才收的到
      return res.status(500).json({
        success: false,
        message: "服務器出錯"
      })

   }

   //如果查詢到了,就提示郵箱或者昵稱已經存在
   if(data) {
      
      return res.status(200).json({
     err_code: 1,
     message:"郵箱或者用戶名已經存在"
    })

   }

   //執行到這裏,不存在,就可以註冊
   new User(body).save(function (err,  data) {
     if(err) {
          return res.status(500).json({
                      err_code: 500,
                     message: ‘Internal error.‘
           })

     }

     res.session.user = body;  //這裏用express保存註冊的信息
     return res.status(200).json({
                 err_code:0,
                message: ‘註冊成功‘
            })
     })
  })
})

(4)註意點:ajax的dataType是json格式的, 如果服務端給我們響應的數據不是json格式,客戶端就接受不到

express中提供了一個json()函數,會自動將字符串轉化為json格式

這裏用到了express-session,來保存用戶信息

5、登錄

服務端接收到了請求數據,然後在數據庫中進行查詢

router.post(‘/login‘,function (req, res) {
   var body = req.body;

   //查找
   User.findOne({
       email: body.email,
       password: body.password},function (err, user){
     if(err) {

         return res.status(500).json({
             err_code:500,
             message: ‘err‘
         })
     }

     if(!user) {
         return res.status(200).json({
             err_code: 1,
             message: ‘郵箱或者密碼錯誤‘
         })
     }
     res.session.user = user  //記錄此時的登錄信息
     return res.status(200).json({
             err_code: 0,
             message: ‘success‘
         })

   })
})

客戶端接受到了服務端的數據響應

<script>
   $(‘#login_form‘).on(‘submit‘, function (e) {

      e.preventDefault()
      var formData = $(this).serialize()
      console.log(formData)
      $.ajax({
        url: ‘/login‘,
        type: ‘post‘,
        data: formData,
        dataType: ‘json‘,
        success: function (data) {
          console.log(data)
          var err_code = data.err_code;

          if (err_code === 0) {
            window.alert(‘登錄成功‘)
           window.location.href=‘/‘
          }else if (err_code === 1) {
            window.alert(‘郵箱或密碼錯誤‘);
          }else if(err_code === 500){
            window.alert(‘服務繁忙,稍後請重試‘)
          }
        }
      })
    })
  </script>

6、退出的時候只要清除session就可以

//退出
router.get(‘/logout‘,function (req, res) {
    req.session.user = null;
    res.redirect(‘/‘)
})

三、總結

1、ajax中的dataType為json, 如果服務器響應的數據步數json格式的,在ajax中接受不到這個信息

2、服務器默認只能重定向只針對同步請求有效, 對異步請求無效

node.js(node.js+mongoose小案例)_實現簡單的註冊登錄退出