这篇文章主要介绍了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.js+Express+MongoDB)的详细内容。更多信息请关注PHP中文网其他相关文章!

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版