【Mongoose应用和文件上传】一.Express框架访问MongDB数据库;二.node实现文件上传

news/2024/11/21 1:47:11/

目录

一.Express框架访问MongDB数据库

1.目的:

(1)mongoose模块的使用

(2)学会代码的封装:dao层、service层、接口层

(3)MVC设计思想:M(Model)、V(View)、C(controller)

2.设计思路:

(1)数据库:blog集合(blogId、title、content、type、author、createAt)

(2)创建Schema-----》创建模型Model-----》操作数据库中的blog集合 

(3)创建Service层:调用dao层访问数据库、接收客户端的数据、把处理的结果响应给客户端

(4)创建接口层:路由接口(路由中间件)

(5)测试接口

(6)创建前端页面

3.代码实现

(1)创建Express项目:确定端口号、跨域的设置、代码更新能自动重启

(2)项目目录结构的设置:

        dao(config、model、crud)

        service

(3)安装mongoose、定义配置文件(连接数据库)

二.node实现文件上传

1.FormData对象:以对象的方式来表示页面中的表单,又称为表单对象。以key:value的方式来保存数据,XMLHttpRequest对象可以轻松的将表单对象发送到服务器端

(1)是一个构造函数:new FormData(),例如:

(2)常用的API:

2.node使用formidable模块实现文件上传

(1)安装:npm install formidable

(2)创建Formidable.IncomingForm对象:本质是一个表单对象

(3)Formidable.IncomingForm对象的属性:

(4)Formidable.IncomingForm对象的方法:

(5)Formidable.File对象的属性:

3.示例:

(1)前端:


一.Express框架访问MongDB数据库

1.目的:

(1)mongoose模块的使用

(2)学会代码的封装:dao层、service层、接口层

(3)MVC设计思想:M(Model)、V(View)、C(controller)

2.设计思路:

(1)数据库:blog集合(blogId、title、content、type、author、createAt)

(2)创建Schema-----》创建模型Model-----》操作数据库中的blog集合 

(3)创建Service层:调用dao层访问数据库、接收客户端的数据、把处理的结果响应给客户端

(4)创建接口层:路由接口(路由中间件)

(5)测试接口

(6)创建前端页面

<head><script src="../js/jquery-3.4.1.js"></script>
</head>
<body><form id="blog"><label for="">标题:<input type="text" name="blogTitle"></label><br><br><label for="">内容:<textarea name="blogContent" cols="30" rows="10"></textarea></label><br><br><label for="">类型:<select name="blogType" id=""><option value="#">请选择</option><option value="javascript">javascript</option><option value="node">node</option><option value="vue">vue</option></select></label><br><br><button type="button" id="btn_submit">提交</button></form><script>$(function(){$('#btn_submit').bind('click',function(){$.ajax({url:'http://127.0.0.1:9000/api/addBlog',type:'post',data:$('#blog').serialize(),dataType:'json',success:function(result){if (result.code === 1000) {alert('添加成功')}}})})})</script>
</body>

3.代码实现

(1)创建Express项目:确定端口号、跨域的设置、代码更新能自动重启

(2)项目目录结构的设置:

        dao(config、model、crud)

config文件----》dbconfig.js

//1.导入mongoose模块
const Mongoose = require('mongoose');
//2.定义MongDB数据库的连接字符串:协议://主机地址:端口号/数据库名
const db_url = 'mongodb://127.0.0.1:27017/my_test'
//3.建立和MongDB数据库的连接:
Mongoose.connect(db_url,{useNewUrlParser:true,useUnifiedTopology:true});
//4.对连接过程进行处理
//4.1连接成功是---connected
Mongoose.connection.on('connected',function (){console.log('连接成功,地址为'+db_url)
})
//4.2连接失败----error
Mongoose.connection.on('error',function (err){console.log('连接失败,原因是'+err)
})
//4.3断开连接-----disconnected
Mongoose.connection.on('disconnected',function (){console.log('断开了数据库的连接')
})
//5.导出Mongoose模块
module.exports = Mongoose

model文件----》blogmodel.js 

//导入配置文件
const Mongoose = require('../config/dbconfig')
//导入Schema
const Schema = Mongoose.Schema
//
const BlogSchema = new Schema({blogId: {type:Number,unique:true},type: {type:String},title: {type:String},content: {type:String},author: {type:String},createAt: {type:Date}
},{versionKey:false, //去掉了文档中的'_v'键timestamps:{    //设置createdAt:true,updatedAt:false}
})
//
module.exports = Mongoose.model('blog',BlogSchema,'blog')

 crud文件----》blogdaol.js 

const BlogModel = require('../model/blogmodel')
//增
exports.insertBlog = async function (blog){return await BlogModel.create(blog)
}
//删
exports.removeBlog = async function (b_id){return await BlogModel.deleteOne({blogId:b_id})
}
//改
exports.modifyBlog = async function(blog){return await BlogModel.findOneAndUpdate({blogId:blog.blogId},{$set:{title:blog.title,content:blog.content,type:blog.type}})
}
//查
exports.findAll = async function(){return await BlogModel.find()   //返回Promise对象
}
//统计记录数
exports.getCount = async function(){return await BlogModel.count()
}

        service

service文件----》blogservice.js 

/*  作用:(1)接收客户端的请求数据:req对象(2)调用dao层访问数据库:导入dao层对象(3)将处理结果响应给客户端:res对象
*/
//1.导入dao层对象
const blogDao = require('../dao/crud/blogdao')
//2.对blog对象进行增删改查,同时响应给数据库
//增
exports.addBlog = async function (req,res){var b_id = 0try{b_id = await blogDao.findAll().then((result)=>{  //参数result中存放的是dao层查询的结果集(本质是数组)return result[result.length-1].blogId   //返回result数组中最后一条记录的blogId属性值})}catch (e) {console.log(e)}let blog = {blogId:b_id + 1,title:req.body.blogTitle, //必须跟前端页面中的name值相同content:req.body.blogContent,type:req.body.blogType,author:'小马尾'}blogDao.insertBlog(blog).then((result)=>{res.json({code:1000,info:result})}).catch((e)=>{console.log(e)})
}
//删
exports.deleteBlog = async function(req,res){let b_id = req.body.blogIdblogDao.removeBlog(b_id).then((result)=>{res.json({code:1000,info:result})}).catch((e)=>{console.log(e)})
}
//改
exports.modifyBlog = async function(req,res){let blog = {blogId:req.body.blogId,title:req.body.title,content:req.body.content,type:req.body.type}blogDao.modifyBlog(blog).then((result)=>{res.json({code:1000,info:result})}).catch((e)=>{console.log(e)})
}
//查
exports.findAllBlog = async function(req,res){blogDao.findAll().then((result)=>{res.json(result)}).catch((e)=>{console.log(e)})
}
//统计
exports.countBlog = async function(req,res){blogDao.getCount().then((result)=>{res.json(result)console.log(result)}).catch((e)=>{console.log(e)})
}

        routes 

api文件-----》blogapi.js

const express = require('express')
const router = express.Router()const blogservice = require('../../service/blogservice')//add  http://127.0.0.1:9000/api/addBlog
router.post('/addBlog',blogservice.addBlog)
//delete    http://127.0.0.1:9000/api/deleteBlog
router.delete('/deleteBlog',blogservice.deleteBlog)
//modify    http://127.0.0.1:9000/api/modifyBlog
router.post('/modifyBlog',blogservice.modifyBlog)
//findAll   http://127.0.0.1:9000/api/findAll
router.get('/findAll',blogservice.findAllBlog)
//countBlog     http://127.0.0.1:9000/api/countBlog
router.get('/countBlog',blogservice.countBlog)module.exports = router

(3)安装mongoose、定义配置文件(连接数据库)

二.node实现文件上传

1.FormData对象:以对象的方式来表示页面中的表单,又称为表单对象。以key:value的方式来保存数据,XMLHttpRequest对象可以轻松的将表单对象发送到服务器端

(1)是一个构造函数:new FormData(),例如:

var formdata = new FormData(form)  //将页面中的表单form转换成FormData对象(即将表单数据转换成key:value)

(2)常用的API:

        FormData.append(key,value):追加数据。向formdata中追加key:value

        FormData.get(key):获取key对应的第一个值

        FormData.getAll(key):获取key对应的所有值

        FormData.delete(key):删除key对应的值

        FormData.has(key):判断formdata是否有key,若有则返回true,否则false

2.node使用formidable模块实现文件上传

(1)安装:npm install formidable

(2)创建Formidable.IncomingForm对象:本质是一个表单对象

                let form = new Formidable.IncomingForm()

(3)Formidable.IncomingForm对象的属性:

                form.encoding:设置字符集

                form.uploadDir:上传文件的保存路径

                form.keepExtensions:若为true,则表示上传时保留原来的扩展名

(4)Formidable.IncomingForm对象的方法:

                form.parse(request,[callback]):转换请求中的表单数据

(5)Formidable.File对象的属性:

                size:上传文件的大小

                path:上传文件的路径

                type:上传文件的类型

                name:上传的文件名

3.示例:

(1)前端:

<head><script src="../js/jquery-3.4.1.js"></script>
</head>
<body><label for="">请选择文件:<input type="file" id="file"></label><br><br><div id="box"></div><script>$(function(){// 给file控件绑定change事件$('#file').change(function(){if ($('#file').val().length) {  //如果用户选择了文件// 获取文件名let fileName = $('#file').val()// 获取文件的后缀---扩展名,并将其转换成小写let extenName = fileName.substring(fileName.lastIndexOf('.'),fileName.length).toLowerCase()// 判断文件类型if (extenName === '.jpg' || extenName === '.png') {// 创建formdata对象let formdata = new FormData()// 追加formdata.append('upload',$('#file')[0].files[0])}else{alert('文件格式不正确')}}})})</script>
</body>


http://www.ppmy.cn/news/728.html

相关文章

【软件安装】Linux中RabbitMQ的安装

① 本篇是基于Linux操作系统中的安装&#xff0c;故先准备一个干净的Linux操作系统。本文中所有的操作基于CentOS8进行安装演示&#xff1b; ② 接下来的演示文本中&#xff0c;红色字体为操作步骤&#xff0c;黑色字体为解释说明&#xff1b; ③ 确保Linux系统中已经安装好必…

Go学习之路:并发(DAY 3)

文章目录前引并发1、Go协程/简单创建2.1、信道/简单创建信道2.2、信道/限制了大小的信道2.3、信道/range close信道3.1、Select语句前引 听了会歌 一看了下今天已经下午2&#xff1a;50了 我们学校也好像开始放学生们回家了 那今天最后就愉快愉快的把我们的 A Tour Of Go 最后…

欧洲肿瘤生物学博士后申请经历

国外博士后的申请者经常会遇到各种问题&#xff0c;从而感叹申请过程的不易。知识人网小编推荐这篇申请经历&#xff0c;或许会给其他申请者带来一定启示。 作者从今年1月开始申请&#xff0c;5月份获得offer。以下是原文&#xff1a; 背景介绍&#xff1a;国内双非一本生物工…

Koa2基础笔记

目录 一、快速入门 二、中间件 链式调用 洋葱圈模型 异步处理 三、路由 koa-router 四、请求参数解析 处理URL参数 处理body参数 五、错误处理 原生的错误处理 使用中间件 一、快速入门 新建文件夹使用VSCode打开&#xff0c;终端运行npm init -y生成package.json…

SSM框架学习记录-Spring_day01

1.核心概念 当前项目中的问题 下面代码的实现十分简单&#xff0c;但是业务层需要调用数据层的方法&#xff0c;就要在业务层new数据层的对象&#xff0c;如果数据层的实现类发生变化&#xff0c;业务层的代码也需要跟着改变&#xff0c;意味着要编译打包和重新部署 // 数据层实…

TF-IDF

2.TF - IDF&#xff1a;作用&#xff1a;提取出来一句话中词的重要性&#xff0c;分成两个部分&#xff1a; tf: 词频(某一类中词条出现的次数 / 该类中所有词条数目) idf: 逆文档频率&#xff08;作用&#xff1a;去掉逗号&#xff0c;的等&#xff09;公式&#xff1a;idf l…

Android S(31) APP 页面绘制流程

接上一篇app 启动流程调用OnCreate方法&#xff0c;页面布局绘制进入setContentView 1、加载布局setContentView() 这里getWindow()直接返回mWindow&#xff0c;这个早在onCreate 调用前Activity#attach里面完成初始化。 进入attach方法&#xff0c;构建一个窗体对象PhoneWind…

365天深度学习训练营-第P2周:彩色图片识别

目录 一、前言 二、我的环境 三、代码实现 1、数据下载以及可视化 2、CNN模型 3、训练结果可视化 4、随机图像预测 四、模型优化 1、CNN模型 2、VGG-16模型 3、Alexnet模型 4、Resnet模型 一、前言 >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]…