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.返回信息
前端:
- 获得接口
- 传递数据传给后端
- 处理后端返回的结果
后端: - 接收前端 传递的数据
- 处理数据
- 返回给前端处理数据后的结果
// 请求方式有,但是他们分别的规范作用如下【规范并不是规定可以遵守也可以不遵守】
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