首页 > 编程 > JavaScript > 正文

Node+Express+MongoDB实现登录注册功能实例

2019-11-19 16:45:39
字体:
来源:转载
供稿:网友

注入MongoDB 依赖

var mongoose = require("mongoose");

由于需要进行表单处理,需要用到bodyParser中间件

bodyParser模块来做文件解析,将表单里的数据进行格式化

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 htmlhtml 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('/');}); 

登录注册的数据库操作

连接数据库

mongoose.connect("mongodb://localhost/express"); // 连接数据库

schema模式定义

数据的更新和查找,以及密码加盐

//schemas/user.jsvar 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() } }});//每次存入数据时都进行判断UserSchema.pre('save', function (next) { var user = this; if (this.isNew) { // 数据是新数据 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.jsvar mongoose = require('mongoose');//模式var UserSchema = require('../schemas/user');//编译模型var User = mongoose.model('user',UserSchema);module.exports = User;

入口文件注入

//app.jsvar User = require('./models/user');app.set('view engine', 'jade'); // jade模板引擎app.set("views", "./views/pages/"); // 视图根目录var serveStatic = require('serve-static'); // 静态文件处理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实现登录注册功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表