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

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="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") 退出登录
        else
            p.navbar-text.navbar-right
                a.navbar-link(href="/signup", data-toggle="modal", data-target="#signupModal") 注册
                span  | 
                a.navbar-link(href="/login", 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();
});
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,需要安装 MongoDB 数据库和 Node.js 运行环境。 然后,创建一个新的文件夹,命名为 myapp,进入该文件夹,打开终端窗口,输入以下命令,初始化项目: ``` npm init ``` 按照提示输入项目信息,初始化完成后,输入以下命令安装 Express 和 Mongoose 模块: ``` npm install express mongoose --save ``` 接下来,创建一个名为 server.js 的文件,输入以下代码: ```javascript const express = require('express'); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); const app = express(); // 配置 bodyParser 解析 POST 请求的数据 app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // 连接 MongoDB 数据库 mongoose.connect('mongodb://localhost/myapp', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('MongoDB Connected...')) .catch(err => console.log(err)); // 定义用户模型 const UserSchema = new mongoose.Schema({ email: String, password: String }); const User = mongoose.model('User', UserSchema); // 注册接口 app.post('/signup', (req, res) => { const { email, password } = req.body; // 检查是否已存在该用户 User.findOne({ email }) .then(user => { if (user) { return res.status(400).json({ msg: '该用户已存在' }); } // 创建新用户 const newUser = new User({ email, password }); newUser.save() .then(user => res.json(user)) .catch(err => console.log(err)); }); }); // 登录接口 app.post('/login', (req, res) => { const { email, password } = req.body; // 检查用户是否存在 User.findOne({ email }) .then(user => { if (!user) { return res.status(404).json({ msg: '该用户不存在' }); } // 验证密码是否正确 if (user.password !== password) { return res.status(400).json({ msg: '密码错误' }); } // 登录成功 res.json({ msg: '登录成功' }); }); }); const port = process.env.PORT || 5000; app.listen(port, () => console.log(`Server started on port ${port}`)); ``` 以上代码实现了一个简单的注册和登录接口,使用了 Express、Mongoose 和 BodyParser 模块。 最后,输入以下命令启动服务器: ``` node server.js ``` 访问 http://localhost:5000 就可以测试接口了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值