node.js简短周结

简介: node.js简短周结

node.js实现注册,登录页面

1. app.js模块

var express = require('express')
var path = require('path')
var bodyParser = require('body-parser')
var session = require('express-session')
var router = require('./router')
var app = express()
app.use('/public/', express.static(path.join(__dirname, './public/')))
app.use('/node_modules/', express.static(path.join(__dirname, './node_modules/')))
// 在 Node 中,有很多第三方模板引擎都可以使用,不是只有 art-template
// ejs、jade(pug)、handlebars、nunjucks
//    <%%>
//    {{}}
//    h1
//    div
//      h1
app.engine('html', require('express-art-template'))
app.set('views', path.join(__dirname, './views/')) // 默认就是 ./views 目录
// 配置解析表单 POST 请求体插件(注意:一定要在 app.use(router) 之前 )
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
// 在 Express 这个框架中,默认不支持 Session 和 Cookie
// 但是我们可以使用第三方中间件:express-session 来解决
// 1. npm install express-session
// 2. 配置 (一定要在 app.use(router) 之前)
// 3. 使用
//    当把这个插件配置好之后,我们就可以通过 req.session 来发访问和设置 Session 成员了
//    添加 Session 数据:req.session.foo = 'bar'
//    访问 Session 数据:req.session.foo
app.use(session({
  // 配置加密字符串,它会在原有加密基础之上和这个字符串拼起来去加密
  // 目的是为了增加安全性,防止客户端恶意伪造
  secret: 'itcast',
  resave: false,
  saveUninitialized: false // 无论你是否使用 Session ,我都默认直接给你分配一把钥匙
}))
// 把路由挂载到 app 中
app.use(router)
app.listen(5000, function () {
  console.log('running...')
})

2. 路由模块


var express = require('express')
var User = require('./models/user')
var md5 = require('blueimp-md5')
var router = express.Router()
router.get('/', function (req, res) {
  // console.log(req.session.user)
  res.render('index.html', {
    user: req.session.user
  })
})
router.get('/login', function (req, res) {
  res.render('login.html')
})
router.post('/login', function (req, res) {
  // 1. 获取表单数据
  // 2. 查询数据库用户名密码是否正确
  // 3. 发送响应数据
  var body = req.body
  User.findOne({
    email: body.email,
    password: md5(md5(body.password))
  }, function (err, user) {
    if (err) {
      return res.status(500).json({
        err_code: 500,
        message: err.message
      })
    }
    // 如果邮箱和密码匹配,则 user 是查询到的用户对象,否则就是 null
    if (!user) {
      return res.status(200).json({
        err_code: 1,
        message: 'Email or password is invalid.'
      })
    }
    // 用户存在,登陆成功,通过 Session 记录登陆状态
    req.session.user = user
    res.status(200).json({
      err_code: 0,
      message: 'OK'
    })
  })
})
router.get('/register', function (req, res) {
  res.render('register.html')
})
router.post('/register', function (req, res) {
  // 1. 获取表单提交的数据
  //    req.body
  // 2. 操作数据库
  //    判断改用户是否存在
  //    如果已存在,不允许注册
  //    如果不存在,注册新建用户
  // 3. 发送响应
  var body = req.body
  User.findOne({
    $or: [{
        email: body.email
      },
      {
        nickname: body.nickname
      }
    ]
  }, function (err, data) {
    if (err) {
      return res.status(500).json({
        success: false,
        message: '服务端错误'
      })
    }
    // console.log(data)
    if (data) {
      // 邮箱或者昵称已存在
      return res.status(200).json({
        err_code: 1,
        message: 'Email or nickname aleady exists.'
      })
      return res.send(`邮箱或者密码已存在,请重试`)
    }
    // 对密码进行 md5 重复加密
    body.password = md5(md5(body.password))
    new User(body).save(function (err, user) {
      if (err) {
        return res.status(500).json({
          err_code: 500,
          message: 'Internal error.'
        })
      }
      // 注册成功,使用 Session 记录用户的登陆状态
      req.session.user = user
      // Express 提供了一个响应方法:json
      // 该方法接收一个对象作为参数,它会自动帮你把对象转为字符串再发送给浏览器
      res.status(200).json({
        err_code: 0,
        message: 'OK'
      })
      // 服务端重定向只针对同步请求才有效,异步请求无效
      // res.redirect('/')
    })
  })
})
router.get('/logout', function (req, res) {
  // 清除登陆状态
  req.session.user = null
  // 重定向到登录页
  res.redirect('/login')
})
// router.post('/register', async function (req, res) {
//   var body = req.body
//   try {
//     if (await User.findOne({ email: body.email })) {
//       return res.status(200).json({
//         err_code: 1,
//         message: '邮箱已存在'
//       })
//     }
//     if (await User.findOne({ nickname: body.nickname })) {
//       return res.status(200).json({
//         err_code: 2,
//         message: '昵称已存在'
//       })
//     }
//     // 对密码进行 md5 重复加密
//     body.password = md5(md5(body.password))
//     // 创建用户,执行注册
//     await new User(body).save()
//     res.status(200).json({
//       err_code: 0,
//       message: 'OK'
//     })
//   } catch (err) {
//     res.status(500).json({
//       err_code: 500,
//       message: err.message
//     })
//   }
// })
module.exports = router
相关文章
|
3天前
|
JSON JavaScript 前端开发
Node.JS第二讲笔记
Node.JS第二讲笔记
33 0
|
10月前
|
JavaScript
Node.Js的补充
Node.Js的补充
40 0
|
SQL 存储 NoSQL
Node.js笔记总结(day5)(一)
Node.js笔记总结(day5)
137 0
Node.js笔记总结(day5)(一)
|
JSON 前端开发 JavaScript
Node.js笔记总结(day6)(二)
Node.js笔记总结(day6)(二)
123 0
Node.js笔记总结(day6)(二)
|
SQL JavaScript 前端开发
Node.js笔记总结(day5)(二)
Node.js笔记总结(day5)(二)
118 0
Node.js笔记总结(day5)(二)
|
JSON JavaScript 前端开发
Node.js笔记总结(day4)(二)
Node.js笔记总结(day4)(二)
98 0
Node.js笔记总结(day4)(二)
|
JSON JavaScript 前端开发
Node.js笔记总结(day4)(一)
Node.js笔记总结(day4)
65 0
Node.js笔记总结(day4)(一)
|
存储 数据采集 JSON
Node.js笔记总结(day6)(一)
Node.js笔记总结(day6)
113 0
Node.js笔记总结(day6)(一)
|
JavaScript 前端开发 数据格式
Node.js笔记总结(day1)(二)
Node.js笔记总结(day1)(二)
173 0
Node.js笔记总结(day1)(二)
|
JavaScript
Node.js笔记总结(day3)(一)
Node.js笔记总结(day3)
153 0
Node.js笔记总结(day3)(一)