中间件 跨域路由

中间件

中间件 middleware (拦截器) 中间的插件

中间件的本质是一个函数

一般情况下有三个参数 req  res  next

中间件的分类

1. 自定义中间件(middleware)

2. 内置中间件(仅有静态资源路径一种)

中间件 middleware

middleware (拦截器)


function middleware (req,res,next){

//如果没有next() 就会被拦截 后边的不执行

next()

}


app.get('/test',中间件1, 中间件2,(req,res)=>{

  console.log(111)

})


app.use(middleware)//全局使用自定义中间件 放到起始位置使用


静态资源路径

app.use(express.static(path__))   “第一个参数是网络访问路径 第二个是express.static(文件夹的绝对路径)”

在express中 内置中间件只有一种(静态资源路径 PHP www目录)

指定一个文件夹 让该文件夹和www目录有相同的功能

app.use()的第一个参数路径为根路径”/”时可以省略不写

app.use(‘网络路径’,express.static(文件夹的绝对路径,’/www’))

路由(中间件)

根据路径将代码进行拆分并模块化

将相关的api放到一个路由里

大概模式为


创建一个 Router.js模块文件

内容为

const express = require('express')

const router = express.Router()

router.get('/login',(req,res)=>{

    ....

})

module.exports= router


server文件引入自定义router模块

const Router = require('自定义模块路径')

app.use(‘网络路径’,Router)

node中跨域问题

因为浏览器的同源策略 所以会有跨域问题(协议 域名 端口)

jsonp  script 里的src不受同源策略影响  需要提供接口的后端参与

cors   设置请求头 需要提供接口的后端参与

服务器代理 (正向代理 反向代理) 服务器之间的请求没有跨域问题

长连接


数据库

关系型数据库  mysql 甲骨文...

非关系型数据库 redis MongoDB(文档型) nosql


mongodb 数据库名

mongod 命令行命令(启动数据库)

mongo 命令行命令(命令行中链接数据库)

mongoose 第三方模块(node用来链接数据库的)

mongodb 的格式

数据库>数据表(集合 collection)>数据(文档 document)

mongodb 的基本命令(增删改查)

数据库

show dbs  显示所有的数据库

db         当前选中的数据库

use  dbName  新建(切换)一个新(已有)数据库 如果数据库里没有东西 则这个数据库是个临时的数据库

db.dropDatabase() 需要先选中想要删除的数据库 再执行此命令 删除数据库


集合

db.createCollection('集合名字')   在数据库里创建一个集合

show collections   显示该库下所有的集合

db.集合名.drop()  删除指定集合  (反馈解说)

db.集合名.insert(data)  在指定集合中增加数据(数据格式为对象格式)

db.集合名.insert(data)(如果data数据有主键id属性“_id”则会使用自定义主键“不推荐使用”)

文档(集合内容)

查询操作

  db.集合名.find()  查询所有的数据

  db.集合名.find().pretty()  查询数据并格式化显示

添加操作

  db.集合名.insert(要添加的数据对象) 添加  默认主键是“_id”不能重复的

  db.集合名.save({要添加的数据对象})  只有主键_id是不存在的时候  save 相当于插入

修改操作

  db.集合名.update({根据条件找到要修改的对象},{$set:{修改完成的结果}(不加$set则会完全覆盖原数据)},{multi:true(更新一个或多个)}) 参数3控制修改全部还是一条“默认为第一条”

  db.集合名.save({要修改的数据}) 修改数据里的主键_id 如果已经存在表示修改(覆盖式修改)

删除操作

  db.集合名.remove({要删除数据的查询条件})  当不写入查询条件时 也就是当查询条件为{}时 (执行全部删除操作)

精准增删改查(条件)

  1. 固值查询

固定字段查询值  例:db.集合名.find({精准数据限制条件”返回多个”})

  2. 范值查询 某一个查询范围  数值查询“仅针对数值类型”

$gt“大于” $gte“大于等于” $lt“小于” $lte“小于等于” $ne“不等于”

    例:db.user.find({age:{$gt:10}})   所有满足age>15的数据

  3. 交集查询 $and

      db.user.find({$and:[条件1 条件2 ...] }) 而且

      例:db.user.find($and:[{age:{$gt:15}},{age:{$lt:20}}])所有age大于15且小于20的数据

  4. 并集查询 or

      db.user.find({$or:[{},{}]}) 或者

      例:db.user.find($or:[{age:{$gt:15}},{age:{$lt:20}}])所有age大于15或小于20的数据

排序

 db.user.find().sort({值为number类型的键名:(-1从大到小)(1从小到大)})

限制条数

  db.user.find().limit(2)   limit 限制

跳过

  db.user.find().skip(2)


瀑布流 分页  上拉加载

5 条数据 一页显示2条 3页

pageSize 每页多少条数据  page 当前的页码数

公式  (page-1)*pageSize – page*pageSize

1    db.user.find().skip(0).limit(2) 跳过0条 查询2条

2.   db.user.find().skip(2).limit(2) 跳过2条 查询2条

3.   db.user.find().skip(4).limit(2) 跳过4条 查询2条


  db.user.find().skip((page-1)*pageSize).limit(pageSize)

 node操作数据库 mongoose

1. 链接数据库

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/集合名', { useNewUrlParser: true })

2. 创建链接对象 错误监听 第一次链接的监听

var db = mongoose.connection

db.on("error", () => { console.log('数据库连接失败') });

db.once('open', function() {

    console.log('数据库第一次链接成功');

})

3. 创建schema对象 数据表头(键名)

只有在这里成名了键名的  数据才会处理 其余键名的一概不管 可以为空值

var zhoubianSchema = new mongoose.Schema({

    name: { type: String },

    price: { type: Number }

});

4. 将schema对象转成数据模型 和数据集合做关联(集合名复数形式)

在schema对象中声明的字段就是需要的字段 多余的不被处理

即表头不存在的键不会进行任何处理

将schema对象和数据集合进行关联

mongoose.model(要关联的集合名,schema对象)

如果写的是单数形式 mongoose 会自动将其以英文规则转为复数形式

var zhoubianModel = mongoose.model("zhoubians", zhoubianSchema)

5. 数据模型对象执行增删改查操作

参考文档http://www.mongoosejs.net/docs/api.html#Model

zhoubianModel.insertMany({ name: '蕾姆', price: 488, Material: "2way" })

返回promise对象  编写过程中多加catch捕获错误

图片的上传功能

上传图片的整个数据到服务器

将本地的图片 file:协议访问 上传到服务器上去 http 协议来访问

1. 前端的实现

通过input 文件域选择图片

上传图片formdata格式 将图片数据添加到formdata对象里

通过ajax调用接口上传图片

       1.contentType false 取消默认上传类型

       2.processData false 不对数据做格式化处理

2. 后端的实现

将本地的图片上传到服务器的静态资源路径内  (multer参考api“https://www.npmjs.com/package/multer”)

multer相当于一个中间件  处理文件上传 req.file(req.files) 获得图片相关数据信息

例:const multer = require('multer');

创建multer对象

var upload = multer({})

图片上传必须使用post方法!!!

    app.post('/file', upload.single('test'), ((req, res) => {

    req.file表示上传的文件信息 默认不存在 只有被中间件 multer处理过后才会存在

    let { buffer, mimetype, size, originalname } = req.file;

    为防止文件被覆盖 同时保证文件名的唯一性 使用时间戳加双重随机数的方式

    let name = (new Date()).getTime() + parseInt(Math.random() * 789456) + parseInt(Math.random() * 123654);

    保证文件的后缀名和初始后缀一致

    let nameAfter = originalname.split('.')

    let ext = nameAfter[nameAfter.length - 1]

    fs.writeFile(path.join(__dirname, `./www/${name}.jpg`), buffer, (err) => {

        if (err) {

            console.log(err);

            res.send({ err: 0, msg: "图片上传失败" })

        } else {

            res.send({ err: -1, msg: '图片上传成功' })

        }

})


app.post(‘./file’,upload.silgle(‘后端自定义key值’),(req,res)=>{

  req.file 上传的文件  文件的数据”buffer”   文件的类型”mimetype”   文件的大小”size”   文件原来的文件名”originalname” 非固定 有的没有

将文件的数据写入到静态资源目录里

1.文件名不重复 时间戳+随机数

2.限制上传的类型  gif png jpg

3.限制上传的尺寸

判断尺寸 !由前端和后端双重判断

    if (size >= 20000) {

        res.send({ err: -1, msg: "文件太大" })

    }

 限制文件类型

    let types = ['jpg', 'gif', 'png'];

    let fileType = mimetype.split('/')[1];

    if (types.indexOf(fileType) === -1) {

        res.send({ err: -2, msg: "该文件类型无法上传" })

    }

})

将图片变成base64

base64 是一种数据格式 就是一个字符串 可以当成图片来使用

        在前端将图片变成base64格式

        先获取图片

        FileReader 对象将图片进行转化

        function upload() {

            let file = document.getElementById('file').files[0]

                创建一个filereader对象   

            let filereader = new FileReader()

            filereader.onload = function() {

                    console.log('图片转化完毕');

                    console.log(filereader.result);

                    $('img').prop('src', filereader.result)

                }

                用filereader对象转化图片

            filereader.readAsDataURL(file)

        }

你可能感兴趣的:(中间件 跨域路由)