NODE 基于express 框架和mongoDB的cookie和session认证 和图片的上传和删除
源码地址
https://gitee.com/zyqwasd/mongdbSession
本项目的mongodb是本地的mongodb 开启方法可以百度一下 端口是默认的27017
页面效果
1. 注册登录页

2. 上传的图片 和删除数据库的数据和服务器上的图片

前端代码 因为是个小项目就用原生写了
1. 这个是login 页面一个注册模块一个登录模块
<!-- 引入axios 方便操作 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
//--------------------- 页面的切换
const registerPage = document.querySelector(".register")
const loginPage = document.querySelector(".login")
register.onclick = () => {
loginPage.style.display = "none"
registerPage.style.display = "block"
}
login.onclick = () => {
loginPage.style.display = "block"
registerPage.style.display = "none"
}
//-----------------------注册页
reg_submit.onclick = () => {
if (!(reg_username.value) && !reg_password.value)
return alert("不能为空");
const fd = new FormData()// 创建一个表单 把数据放进去 发给后端
fd.append("avatar", file.files[0]);
fd.append("password", reg_password.value)
fd.append("username", reg_username.value)
// 发送头像和用户名密码去注册
axios.post("/login", fd).then(res => {
alert("注册" + (res.data.ok ? "成功" : "失败"))
location.reload();
})
}
// ----------------------登录页
submit.onclick = () => {
if (!(username.value) && !password.value)
return alert("不能为空");
axios.post("/login/find", {
username: username.value,
password: password.value
})
.then(res => {
console.log(res.data)
if (res.data.ok) { //设置username 和 头像便于首页显示
localStorage.setItem("username", username.value)
localStorage.setItem("avatar", res.data.avatar)
location.href = '/'
} else {
alert("密码错误")
}
})
}
</script>
2. 首页代码
fetch("/api")
.then(res => res.json())
.then(res => {
render(res)
})
username.innerHTML = localStorage.getItem("username")
img.src = localStorage.getItem("avatar")
function render(arr) {//渲染页面
table.innerHTML = arr.map((item, index) => `
<tr id='${item._id}' data-src='${item.avatar}'>
<td>${index}</td>
<td>${item.username}</td>
<td><img src="${item.avatar}" alt=""></td>
<td><button id='del'>del</button></td>
</tr>
`).join("")
}
table.onclick = (e) => {
if (e.target.nodeName === "BUTTON") {
const parent = e.target.parentNode.parentNode
const src = parent.dataset.src
// 发请求删除对应数据库的内容
fetch(`/api?id=${parent.id}&src=${src} `, { method: 'delete' })
.then(res => res.json()).then(res => {
// 删除对应的tr
res.ok && parent.remove()
})
}
}
后端代码
1. 因为时间问题就用了express生成器 可以去expresse 官网查看 获取下载我的代码
连接mongodb
1. 创建一个配置文件夹config 下载安装mongoose 模块 连接数据库 (一定要先开启数据库)
const mongoose = require("mongoose");
// 因为是演示就自己在本地搭了一个数据库
// 连接好了数据库并且 创建了一个叫users 的数据库
mongoose.connect("mongodb://127.0.0.1:27017/users")
2. 在www 文件下引入
// 引入数据库
require("../config/mongoose")
3. 因为mongodb的数据自由度高所有配置一个模板来规定数据类型 在model文件夹/userModel
const mongoose = require("mongoose")
// 定义数据类型
const modelType = {
username: String,
password: String,
avatar: String,
}
const userModel = mongoose.model("user", new mongoose.Schema(modelType));
module.exports = userModel
配置multer 模块在app.js中的代码
1.在app 中引入multer模块来处理数据和配置文件下载的路径
// 引入multer
const multer = require("multer")
// 部署放头像的文件
const upload = multer({ dest: "public/uploads/" })
2. 在app 中处理login 上传来的图片把他放入到指定文件夹中 如果想知道如何上传多个文件可以私聊我
// 处理文件上传数据 single 是上传单个文件 array是上传多个文件
app.use("/login", upload.single("avatar"), loginRouter);
配置session 在app.js中代码
1. 在app.js中引入express-session 和 connect-mongo
// 引入session 模块
const session = require("express-session");
// 引入 connect-mongo 这个是存储cookie 到mongodb 中自动删除和更新
const MongoStore = require("connect-mongo")
2.配置初始化配置session
// 配置session
app.use(session({
name: "mySession",
secret: "session secret",//配置秘钥
resave: true,//重新设置cookie 值可以重新计时
saveUninitialized: true,//初始化session 一开始就给服务器发送一个cookie
cookie: {
maxAge: 1000 * 60 * 60, //设置过期时间
secure: false,//是否在安全模式下就是https 下访问
},
rolling: true,//表示在超时前刷新就会从新计时cookie 为false 表示超时前刷新多少次都会按照第一次开始计时
// 配置cookie 存入到MongoDB 中
store: MongoStore.create({
mongoUrl: 'mongodb://127.0.0.1:27017/my_session',//链接数据库
ttl: 1000 * 60 * 60, //设置过期时间
})
}))
3. 全局拦截认证session
// 全局拦截session
app.use((req, res, next) => {
if (req.url.includes("login")) return next()
// 登录成功了就给session挂载一个user属性
if (req.session.user) {
// 如果有就放行重新设置session 值
req.session.myDate = Date.now();
next()
} else {
// 因为我是又有后端渲染又有前端的请求所以我们要判断
req.url.includes("api") ?
// 如果是api 就send ok:1
res.status(401).send({ ok: 1 })
// 如果是 页面的请求就跳到login 页面
: res.redirect("/login")
}
})
处理login页面数据
1. 在router中的路径处理
const express = require("express");
const controller = require('../controller/userController');
const router = express.Router()
router.get("/", (req, res) => {
res.render("login")
})
// 注册来的数据
router.post("/", controller.create)
// 登录来的数据
router.post("/find", controller.find)
module.exports = router
处理数据响应每一个接口的处理函数 因为代码少就没有多分
const userService = require("../service/userService")
const controller = {
// 创建数据到mongodb中注册页传来的
async create(req, res) {
// 数据解构出来
const { username, password } = req.body
// 如果上传头像就存储上传来的
// 如果没有上传来就走默认头像
const avatar = req.file ?
"/uploads/" + req.file.filename :
"/images/avatar.jpeg";
// 去service模块创建数据到数据库中
await userService.create(username, password, avatar);
// 返回前端数据
res.send({ ok: 1 })
},
async find(req, res) {
const { username, password } = req.body;
// 用async 和await 来去数据库查找数据 主要代码在service中
let data = await userService.find(username, password)
if (data.length) {
// 如果验证通过了就设置一个session值
req.session.user = data[0]
// 如果找到了 返回前端一个当前登录用户的头像
res.send({ ok: 1, avatar: data[0].avatar })
} else {
res.send({ ok: 0 })
}
},
// 查找所有数据用来渲染主页 显示页面 因为都是异步的所以用了async 和await
async findAll(req, res) {
let data = await userService.findAll()
res.send(data)
},
// 前端发来的删除用户请求
async delete(req, res) {
// 把id 和图片的src 结构出来
const { id, src } = req.query
// 去删除数据库中的数据
let data = await userService.delete(id)
// 去删除本地文件 因为代码少懒得分一个模块了
await userService.deleteFile(src)
// 给前端传一个布尔值这个如果删除了就是true 没有就是false
res.send({ ok: data.acknowledged })
}
}
module.exports = controller
处理数据库和文件夹中的数据
const userModel = require("../model/userModel")
// 引入fs 模块 因为是异步所以要用promises
const fs = require("fs").promises
const service = {
// 把数据存储到数据库中
create(username, password, avatar) {
// 用我们之前的模板直接来创建数据
return userModel.create({
username, password, avatar,
})
},
find(username, password) {
// 查找数据给前面模块返回回去 条件是传来的值
return userModel.find({ username, password })
},
findAll() {
// 只获取到["username", "avatar"]两个字段
return userModel.find({}, ["username", "avatar"])
// 当然因为数据量少没有搞分页什么的
// find().count()是获取总的条数
// sort() 按照什么排序
// skip ()跳过几条
// limit() 要几条
// 也蛮简单的可以试试
},
delete(id) {
// 删除数据库中的数据
return userModel.deleteOne({ _id: id })
},
async deleteFile(src) {
// 如果是默认数据 我把数据存储到public /images 中了其他的在uploads 中
if (src.includes("/images")) return;
// 因为删除文件没有文件会报错影响服务器 就try catch 处理一下
try {
return data = await fs.unlink(`./public/${src}`)
} catch (error) {
return false
}
}
}
module.exports = service
NODE 基于express 框架和mongoDB的cookie和session认证 和图片的上传和删除的更多相关文章
- 【Node.js】二、基于Express框架 + 连接MongoDB + 写后端接口
在上节,我们讲了如何搭建express环境,现在我们说说如何通过node.js写服务接口给前端调用 1. 首先通过MongoDB建好数据库与表格 例如,我的数据库名字为db_demo,数据库表格为go ...
- 【Node.js】一、搭建基于Express框架运行环境+更换HTML视图引擎
1)安装express generator生成器 这个express generator生成器类似于vue-cli脚手架工具,用来创建一个后端项目,首先我们要对生成器进行全局安装,在cmd中输入下 ...
- Node.js Express 框架学习
转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...
- Node.js Express框架
Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...
- 基于express框架的应用程序骨架生成器介绍
作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样使用express-generator工具高速生成基于express框架的应用程序骨架: 1. 安装express-gener ...
- Node.js Express 框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...
- 基于express框架的留言板实现步骤
这个留言板是基于express框架,和ejs模板引擎,首先需要在根目录安装express框架,然后安装ejs模块和body-parser(获取用户表单提交的数据):建立项目目录 message,然后依 ...
- express学习(三)—— cookie和session
express学习(三)-- cookie和session cookie存在浏览器中,最大只能保存4K数据,不安全 session存在服务器中,不能独立(先读取cookie再读取session),较安 ...
- 基于HTML5的可预览多图片Ajax上传
一.关于图片上传什么什么的 在XHTML的时代,我们使用HTML file控件上传图片一次只能上传一张.要一次上传多图,做法是借助于flash.例如swfupload.js.可惜,使用复杂的点,比如f ...
随机推荐
- [LINUX] 像电影里的黑客一样用 terminal 作为日常开发
目录 1.效果预览 2.具体实现 2.1 定位鼠标位置 2.2 获取屏幕位置 2.3 计算鼠标在哪个窗口 2.4 1920x1080 平铺效果设计 2.5 1280x1024 平铺效果设计 3 代码 ...
- docker 部署 minio
1.下载镜像 docker pull minio/minio 2.启动 docker run -p 9000:9000 --name minio \ -d --restart=always \ -e ...
- Tapdata 在线研讨会:如何快速上手 Tapdata Cloud?
偶然接触到 Tapdata Cloud,据说不仅可以实现异构数据实时同步,还永久 100% 免费,但就是不知道怎么获取.怎么用? 打开相关文档逐渐陷入迷茫,术语."黑话"随处可见, ...
- 【docker专栏3】docker基础概念-容器、镜像以及引擎组成部分
一.docker镜像与容器 docker镜像是一个可执行的静态独立软件包,包含打包程序代码和软件运行环境等文件.如:代码.运行时库.环境变量和配置文件等都包含在其中.容器是镜像的运行时状态(镜像中的软 ...
- 开源数据质量解决方案——Apache Griffin入门宝典
提到格里芬-Griffin,大家想到更多的是篮球明星或者战队名,但在大数据领域Apache Griffin(以下简称Griffin)可是数据质量领域响当当的一哥.先说一句:Griffin是大数据质量监 ...
- GET 请求和 POST 请求的区别和使用
作为前端开发, HTTP 中的 POST 请求和 GET 请求是经常会用到的东西,有的人可能知道,但对其原理和如何使用并不特别清楚,那么今天来浅谈一下两者的区别与如何使用. GET请求和POST请求的 ...
- APISpace万券齐发,API采购大放价
Eolink APISpace 是 Eolink 旗下专业的API 数据交易平台,上面拥有海量的API,开发者可以根据需求自由选择. 环境天气 全国天气预报,支持全国以及全球多个城市的天气查询,包含国 ...
- APISpace 周公解梦API接口 免费好用
<周公解梦>,是根据人的梦来卜吉凶的一本解梦书籍,它对人的七类梦境进行解述. 周公解梦API,周公解梦大全,周公解梦查询,免费周公解梦. APISpace 有很多免费通用的API接 ...
- 1_day01_java入门
java入门 学习目标: 1.熟悉计算机编程语言 2.熟练掌握java特点 3.熟练配置java开发环境 4.熟练编写入门程序 5.熟练编写注释信息 一.计算机语言 1.1 什么是编程语言 计算机语言 ...
- 图论板子总结 / Graph Summary
Template List: 最短路问题:Dijkstra(朴素版.堆优化版),Bellman-Ford,SPFA,Floyd 最小生成树:Prim.Kruskal 二分图问题:染色法.匈牙利算法 朴 ...