全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

登录注册的数据库操作

连接数据库

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

schema模式定义

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

//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()
 }
 }
});
//每次存入数据时都进行判断
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.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'); // 静态文件处理
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实现登录注册功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# node  # express  # mongodb  # express登录注册  # 登录  # Express + Session 实现登录验证功能  # Nodejs进阶:express+session实现简易登录身份认证  # Node.js+Express+MySql实现用户登录注册功能  # 用node和express连接mysql实现登录注册的实现代码  # express框架中使用jwt实现验证的方法  # express + jwt + postMan验证实现持久化登录  # Vue+Express实现登录状态权限验证的示例代码  # nodejs使用express获取get和post传值及session验证的方法  # DevExpress实现GridControl单元格编辑验证的方法  # Express实现登录验证  # 表单  # 新和  # 小编  # 加盐  # 连接数据库  # 在此  # 给大家  # 越大  # 来做  # 后将  # 欢迎你  # 输入用户名  # 所述  # 给我留言  # 感谢大家  # 输入密码  # 身份验证  # 注册成功  # 疑问请  # 有任何 


相关文章: 宝塔建站助手安装配置与建站模板使用全流程解析  高防服务器租用指南:配置选择与快速部署攻略  高端智能建站公司优选:品牌定制与SEO优化一站式服务  哈尔滨网站建设策划,哈尔滨电工证查询网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  python的本地网站制作,如何创建本地站点?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何在Golang中使用replace替换模块_指定本地或远程路径  中山网站制作网页,中山新生登记系统登记流程?  建站之星×万网:智能建站系统+自助建站平台一键生成  行程制作网站有哪些,第三方机票电子行程单怎么开?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  建站之星北京办公室:智能建站系统与小程序生成方案解析  Java解压缩zip - 解压缩多个文件或文件夹实例  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  香港服务器租用费用高吗?如何避免常见误区?  建站之星后台管理:高效配置与模板优化提升用户体验  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  广州建站公司哪家好?十大优质服务商推荐  盐城做公司网站,江苏电子版退休证办理流程?  建站OpenVZ教程与优化策略:配置指南与性能提升  在线制作视频网站免费,都有哪些好的动漫网站?  如何快速查询网址的建站时间与历史轨迹?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  微信小程序 五星评分(包括半颗星评分)实例代码  如何通过宝塔面板实现本地网站访问?  深圳网站制作平台,深圳市做网站好的公司有哪些?  青岛网站建设如何选择本地服务器?  如何高效配置IIS服务器搭建网站?  如何快速搭建二级域名独立网站?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  做企业网站制作流程,企业网站制作基本流程有哪些?  如何快速搭建高效WAP手机网站吸引移动用户?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  C#如何在一个XML文件中查找并替换文本内容  C++用Dijkstra(迪杰斯特拉)算法求最短路径  c++怎么用jemalloc c++替换默认内存分配器【性能】  网站制作报价单模板图片,小松挖机官方网站报价?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  简历在线制作网站免费版,如何创建个人简历?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何快速搭建高效服务器建站系统?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  linux top下的 minerd 木马清除方法  视频网站app制作软件,有什么好的视频聊天网站或者软件?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。