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

news2024/11/27 0:29:18

目录

一.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 = 0
    try{
        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.blogId
    blogDao.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.coloradmin.cn/o/51836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.RabbitMQ高级特性

5.RabbitMQ高级特性 为什么不是RabbitMQ的事务&#xff1f; 这是从官网直接翻译过来的&#xff1a;网络可能以不太明显的方式出现故障&#xff0c;而且检测某些故障需要时间。因此&#xff0c;向套接字编写协议帧或一组帧(例如发布的消息)的客户端不能假定消息已经到达服务器…

【库存控制】基于蜜蜂算法优化库存控制附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

如何将dwg文件转成kml文件

第一步&#xff1a; 在CAD中将DWG另存为 DXF&#xff0c;如下&#xff1a; 注意&#xff1a;&#xff08;中文乱码&#xff09;为了打开的中文不出现乱码&#xff0c;保存DXF文件请选择如下的选项 第二步&#xff1a; 下载安装Bigemap GIS Office download.bigemap.com/bmset…

12.01 M4-UART-IT实验

1.使用CORTEX-M4核&#xff0c;实验中断实验和串口实验结合--->上传到CSDN 按键触发时&#xff0c;LED灯状态取反&#xff0c;并且在串口工具打印一句话 KEY1按键按下&#xff0c;LED1状态取反&#xff0c;串口工具打印key1 down!!!! 主要代码gpio.c void HAL_GPI…

C++ 语言学习 day14 复习 (6)

1.stack / queue(栈&#xff0c;队列) stack 构造函数 stack<int> v; 入栈 v.push(i); 出栈 v.pop(); 是否为空 v.empty() queue 构造函数 queue<int> v; 入队 v.push(i); 出队 v.…

下载axios时出现很多npm ERR错误:npm ERR! code ERESOLVEnpm ERR! ERESOLVE could not resolve

出现的下载错误&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolvenpm ERR! npm ERR! while resolving: vue/eslint-config-standard6.1.0npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/eslint-plugin-vue npm ERR!dev eslint-plugin-…

毕业设计案例:Python实现疫苗接种数据库管理系统

一、序言 那一年过年前&#xff0c;疫情开始爆发&#xff0c;对全国人民的生活和工作造成了严重的影响。但凭借着国家强盛的实力&#xff0c;新冠疫苗也很快的被技术人员研发出来&#xff0c;人们通过接种新冠疫苗来抵御新冠病毒的危害。本次通过接种新冠疫苗的这个数据统计&a…

(一)正则表达式——基础概念

&#xff08;一&#xff09;正则表达式——基础概念 概括 用来处理字符串的规则。除了对象、函数&#xff0c;我们操作得最多的就是字符串 正则的两大作用&#xff1a; 验证是否匹配把匹配到的内容捕获到量词元字符*特殊元字符点. &#xff1a;除了\r \n以外的字符 普通元字符h…

【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域&#xff08;MSER&#xff09; 1. 最大稳定极值区域&#xff08;MSER&#xff09; 最大稳定极值区域&#xff08;MSER-Maximally Stable Extremal Regions&#xf…

RNN/LSTM (三) 学习torchtext源码

文章目录包装dataset构建词库1.列举数据源2. 遍历数据3. 列举特殊符号4. 构建词库 Field::vocab_clsload_vectors构建读指针 data.BucketIterator在上一文&#xff0c;我们学习了基于torchtext编写lstm模型的实践案例&#xff0c;本文将结合上文案例&#xff0c;深入案例代码&a…

Python自动化之Excel利器openpyxl

文章目录前言一、Workbook1.1 读取xlsx文件1.2 保存二、Sheet2.1 创建Sheet2.2 遍历Sheet2.3 移动Sheet2.4 删除Sheet2.5 插入、删除行列三、单元格3.1 获取某个单元格3.2 遍历单元格3.3 获取范围单元格3.4 单元格赋值3.5 合并/解除合并单元格3.6 单元格数据格式3.7 单元格数字…

[附源码]Python计算机毕业设计Django儿童早教课程管理系统论文2022

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

算法设计与分析 SCAU19180 集合划分问题

19180 集合划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 教材课后习题2-8 n个元素的集合{1,2,…,n}可以划分若干个非空子集。例如&#xff0c;当n4时&#xff0c;集合{1,2,3,4}可以划分为15个不同的非…

微信小程序开发学习文档(万字总结,一篇搞定前端开发)

一、微信小程序简介 与网页开发不同&#xff0c;小程序有自己的一套标准开发模式&#xff1a;-申请小程序开发账号-安装小程序开发工具-创建和配置小程序项目 1.1 创建第一个小程序 1.2 主界面的5个组成部分 1.3小程序项目的基本构成 pages 用来存放所有小程序的页面&#xf…

Java并发编程—Thread类中的start()方法如何启动一个线程【原理分析】?

一、java线程的介绍&#xff1a; 在java的开发过程中&#xff0c;很多铁子对于java线程肯定不感到陌生&#xff0c;作为java里面重要的组成部分&#xff0c;这里就从如何创建一个线程给大家进行分析&#xff1b; 二、相关知识引入&#xff1a; ​ 之前我了解过&#xff0c;j…

2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试

2022年中职组浙江省“网络空间安全”赛项 B-1:Windows渗透测试一、竞赛时间 420分钟 共计7小时 吃饭一小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第①阶段: 单兵模式系统渗透测试 任务一: Windows操作系统渗透测试 任务二: Linux操作系统渗透测试 任务三…

[附源码]Python计算机毕业设计SSM科技项目在线评审系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

segmenter

patch embedding&#xff1a;例如输入图片大小为224x224&#xff0c;将图片分为固定大小的patch&#xff0c;patch大小为16x16&#xff0c;则每张图像会生成224x224/16x16196个patch&#xff0c;即输入序列长度为196&#xff0c;每个patch维度16x16x3768&#xff0c;线性投射层…

hexo+github手把手教你部署个人博客

一、安装并配置Node.js&#xff08;原本就有安装&#xff09; 参考&#xff1a;(1条消息) Node.js安装与配置&#xff08;详细步骤&#xff09;_普通网友的博客-CSDN博客_nodejs安装配置 一、下载Node.js官网下载 安装位置与环境变量配置 系统属性-环境变量-系统变量-Path 验…

129页4万字某智慧能源集团数字化管控平台项目 建设方案

目录 数字化管控平台相关项目建议书 1 目录&#xff1a; 1 一、相关项目背景 2 二、需求理解 3 2.1 需求理解 3 三、方案设计 5 3.1 整体方案设计 7 3.3.1 整体架构 7 3.3.2 解决方案说明 8 3.3.3 需求应答 10 3.2 数据仓库 11 3.2.1 数据仓库架构 11 3.2.2 数据仓库产品说明 1…