目录
一.Express框架访问MongDB数据库
1.目的:
(1)mongoose模块的使用
(2)学会代码的封装:dao层、service层、接口层
(3)MVC设计思想:M(Model)、V(View)、C(controller)
2.设计思路:
(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>