Node.js当中有很多框架.express中间件详细分析

Node.js当中有很多框架

比如express框架 koa框架 egg框架

express框架

打开express官网https://www.expressjs.com.cn/starter/installing.html
安装

常用第三方的模块

Express

Express 是一个第三方模块,对原生模块封装了一套更灵活、更简洁的应用框架,其在 Node.js 环境的地位和作用好比 jQuery 在前端的地位和作用。使用 Express 可以快速地搭建一个完整功能的网站

安装

    npm install express

使用

```javascript
    //引入模块
    var express = require('express');
    //实例化express()对象
    var app = express();

    //开启服务器,定义端口8080:
    app.listen(8080, function(){
        console.log('Server running on http://localhost:8080');
    });

Express中间件(middleware)

中间件是一个封装了某些处理数据功能的函数,在request或response调用之前执行,从本质上来说,一个Express应用其实就是在调用各种中间件

使用中间件

格式:app.use([path],...middlewares)

内置中间件:
  • express.static(root, [options])
    基于 server-static 开发的中间件,负责托管 Express 应用内的静态资源,如:图片, CSS, JavaScript 等,一般用于实现静态资源服务器

    • root 参数指的是静态资源文件所在的根目录.
    • options 对象是可选的,支持以下属性:
      • maxAge
        // express实现静态资源服务器
        app.use(express.static('./public'));
    
  • express.json()

  • express.urlencoded()

  • express.Router()

自定义中间件

格式为:function(request,response,next){}

  • next():next是一个方法,因为一个应用中可以使用多个中间件,而要想运行下一个中间件,那么上一个中间件必须运行
    app.use((req,res,next)=>{
        // 任何请求都进入此中间件
    });

    app.use('/goods',(req,res,next)=>{
        //只有请求地址为/goods时才进入此中间件
    })
常用第三方中间件
  • body-parser:解析body中的数据到request.body
  • multer:用于处理FormData数据(表单的 enctype="multipart/form-data"属性)
  • cookie-parser :解析客户端cookie中的数据到request.cookies
  • express-session :解析服务端生成的sessionid对应的session数据到request.session属性
  • http-proxy-middleware : 服务器代理中间件

定义路由

*** 服务器知识**
* 请求对象:request
* 响应对象:response
* 前后端分离(BSR)与服务器渲染(SSR)的概念等
接口规范:RESTfulAPI
* 请求类型
* 请求路径
获取请求参数
* 参数通过请求路径传递(get):request.query
* 参数通过请求体/formData(post):request.body
* 动态路由:request.params

安装

首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录。
$ mkdir myapp
$ cd myapp
通过 npm init 命令为你的应用创建一个 package.json 文件。 欲了解 package.json 是如何起作用的,请参考 Specifics of npm’s package.json handling.
$ npm init
此命令将要求你输入几个参数,例如此应用的名称和版本。 你可以直接按“回车”键接受大部分默认设置即可,下面这个除外:
entry point: (index.js)
键入 app.js 或者你所希望的名称,这是当前应用的入口文件。如果你希望采用默认的 index.js 文件名,只需按“回车”键即可。
接下来在 myapp 目录下安装 Express 并将其保存到依赖列表中。如下:
$ npm install express --save
如果只是临时安装 Express,不想将它添加到依赖列表中,可执行如下命令:
$ npm install express --no-save
npm 5.0+ 版本在默认情况下会将安装的模块添加到 package.json 文件中的 dependencies 列表中。对于较老的 npm 版本,你就必须指定 --save 参数。然后,照旧执行 npm install 命令即可自动安装依赖列表中所列出的所有模块。

快速入门有安装教程以及小案例

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

api接口的构成

接口四要素:1.接口地址URL 2.请求的方法 3.传递的字段 4.返回信息
前端:

  1. 获得接口
  2. 传递数据传给后端
  3. 处理后端返回的结果
    后端:
  4. 接收前端 传递的数据
  5. 处理数据
  6. 返回给前端处理数据后的结果
	// 请求方式有,但是他们分别的规范作用如下【规范并不是规定可以遵守也可以不遵守】
5.	// get请求/接口     →查
6.	// post请求/接口    →增
7.	// put请求/接口     →改【修改一部分】
8.	// patch请求/接口   →改【覆盖式的改,全部改。】
9.	// delete请求/接口  →删
10.	// 获取请求参数的方式
11.	// 1.参数通过秦淮河求路径传递(GET请求):request.query
12.	// 2参数通过请求体/FormData(POST请求):request.body
13.	// 3.动态路由:request.params

14.	// 动态路由的写法
15.	var express=require('express')
16.	var bodyParser=require("body-parser")
17.	const { request } = require('express')
18.	var app=express()
19.	// parse application/x-www-form-urlencoded
20.	app.use(bodyParser.urlencoded({ extended: false }))
21.	app.use(bodyParser.json())
22.	// 动态路由的写法在地址参数里加/:id
23.	// 我们如果想获得前端地址栏发送的id对象那么就要用req.params去获取
24.	// 动态路由接收请求需要用req.params
25.	app.post("/text/:id",(req,res)=>{
26.	    console.log(req.params);
27.	    // Object.assign方法是对象合并
28.	    var obj = Object.assign(req.params,req.body);
29.	    // 扩充一下对象合并还有扩展运算符的写方法
30.	    var dx={a:1,...req.body,...req.params}
31.	    console.log(dx);
32.	    // 我们使用对相关中的扩展运算符也可以合并对象。
33.	    res.send(obj)
34.	})
35.	
36.	app.post("/dtly/:id",(req,res)=>{
37.	    res.send(req.params)
38.	})
39.	app.listen(3500,()=>{
40.	    console.log("服务器3500已经成功开启!");
41.	})

在这里插入图片描述
在这里插入图片描述

request第三方模块

request模块的地址: https://www.npmjs.com/package/request

// 通过第三方模块request爬取去哪儿网上的图片
// 1.爬取目标网站
// 2.分析目标资源  图片资源
// 3.根据图片链接将图片下载到本地当中

var cheerio=require("cheerio")
const request = require('request');
var url="https://www.qunar.com/"
request(url, function (error, response, body) {
    // 错误信息
  console.error('error:', error); // Print the error if one 
    //response是返回对象   
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
//   需要的数据如下
  console.log('body:', body); // Print the HTML for the Google homepage.
  var $=cheerio.load(body)
  $("img").each((index,el)=>{
      console.log("图片"+index);
      let imgSrc=$(el).attr("src")
    //   给meiyouhttp协议的链接地址添加协议
    //如果有些地址没有http://这几段字符安就添加上
      if(imgSrc.indexOf("http://")===-1){
          imgSrc="http:"+imgSrc
      }
      console.log(imgSrc);
      loadImg(index,src)
  })
});

function loadImg(index,src){
    request(src).pipe(fs.createWriteStream(`${index}.png`))
    // pipe:管道符号
    // fs.createWriteStream:流式写入
// request(src,function(error, response, body){

// })
}

中间件

// 中间件middleware(可以理解为拦截器)

// 中间件的本质是一个函数
// 常用的情况有三个参数req res next

// 中间件的分类
// 1.自定义中间件
// 2.内置中间件
// 3.第三方中间件

一:自定义中间件【自己写的中间件】

// 创建一个自定义中间件
// 自定义中间件的作用:可以在中间价里做一些判断,如果成功的话就next()执行下一个,失败就不写next()拦截。
 next()//要用next方法会执行下一个中间件,即不会拦截。
    //自定义中间件会阻止后面内容或者函数进行。
    // 如下的app.get方法内部,如果自定义中间件的函数内部不写next()就会直接打印"这里是中间件!".
    // 而不会打印"111",也就是不执行app.get第三个参数的回调函数了。因为被自定义的middleware1中间件拦截了。
    // 如果你想不被拦截,那么就要在自定义中间件的内部加上next()方法。
function middleware1(req,res,next){
    console.log(req.query.boy,req.query.gril);
    console.log("这里是中间件1!");
    next()//要用next方法会执行下一个中间件,即不会拦截。
    //自定义中间件会阻止后面内容或者函数进行。
    // 如下的app.get方法内部,如果自定义中间件的函数内部不写next()就会直接打印"这里是中间件!".
    // 而不会打印"111",也就是不执行app.get第三个参数的回调函数了。因为被自定义的middleware1中间件拦截了。
    // 如果你想不被拦截,那么就要在自定义中间件的内部加上next()方法。
}
function middleware2(req,res,next){
    console.log(req.query.boy,req.query.gril);
    console.log("这里是中间件2!");
    next()//要用next方法会执行下一个中间件,即不会拦截。
    //自定义中间件会阻止后面内容或者函数进行。
    // 如下的app.get方法内部,如果自定义中间件的函数内部不写next()就会直接打印"这里是中间件!".
    // 而不会打印"111",也就是不执行app.get第三个参数的回调函数了。因为被自定义的middleware1中间件拦截了。
    // 如果你想不被拦截,那么就要在自定义中间件的内部加上next()方法。
}

中间件的使用方法1

// 请求当中第一个参数是拼接的地址,最后一个参数是回调函数,第一个参数和最后一个参数之间可以添加多个中间件.使用中间件就是在第一个 参数和最后一个参数之间加上中间件的名称。
如下使用例子.👇
app.get("/zjj",middleware1,middleware2,(req,res)=>{
    var t=req.query
    console.log("111",req);
    res.send(t)
})
app.listen(2050,()=>{
    console.log("服务器2050端口已经成功开启!");
})

中间件的使用方法2

中间件的使用方法第二种就是写app.use()
app.use(middleware1,middleware2)//用这个方法表示app内部已经使用了中间件,app.use方法参数是中间件名称,可以写多个中间件名
app.get("/zjj",(req,res)=>{
    var t=req.query
    console.log("111");
    res.send(t)
})
app.post("/z",(req,res)=>{
var {boy,gril}=req.body
console.log("mjn",boy,gril);
res.send(req.body)
})
app.listen(2050,()=>{
    console.log("服务器2050端口已经成功开启!");
})

二:内置中间件

Express中间件官网https://www.expressjs.com.cn/4x/api.html#express
• express.json()

• express.raw()
• express.Router()
• express.static()
• express.text()
• express.urlencoded()

【常用的是静态资源服务器路径】

// 在express当中内置中间件只有一种
// 那就是静态资源路径 php  www
// 指定一个文件夹 让该文件夹和www目录有相同的功能也就是指定的文件地址代替localhost:+端口号
const express=require("express")
const fs=require("fs")
const path=require("path")
const app=express()
// 如下 指定了静态资源服务器地址为中间件这个文件夹
// express中使用内置中间件的时候第一个参数可以写,/xxx,第二个参数在写你想设置的静态资源服务器地址
// 当你定义了第一个参数的时候那么就表示localhost:+端口号+/你写的参数,才是静态资源服务器的目录
// 如果不写第一个参数则默认localhost:+端口号是静态资源服务器的目录
// app.use(express.static(__dirname))
app.use("/public",express.static(path.join(__dirname)))
app.listen(3600,()=>{
    console.log("服务器端口3600已经成功被开启!");
})

中间件之第三方中间件【别人写好的中间件我们安装后使用】

如配合post请求时使用的body-parser以及cors中间件
点击打开express官网:https://www.expressjs.com.cn/
在这里插入图片描述
点击资源→点击中间件
在这里插入图片描述
如下都是第三方中间件
在这里插入图片描述
第三方中间件还有http-proxy-middleware它常用作服务器代理的时候用
npm install --save-dev http-proxy-middleware

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值