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

网友投稿 324 2023-05-21


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('注册成功——用户名:' + ushttp://er);

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实现登录注册功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Angular中使用$watch监听object属性值的变化(详解)
下一篇:使用ftpClient下载ftp上所有文件解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~