express框架

123 阅读5分钟

运行第一个express程序

expresss 是一个第三方模块(在npm上可以下载),在使用它之前要先去下载它,在下载包之前要先创建项目,并通过npm init 创建package.json文件。

创建项目并初始化

创建一个空目录(learn-express)(目录名不要有汉字,也不是某个包的名字),在此目录下运行npm init 命令来生成package.json文件

# 在你的项目根目录下,打开小黑窗# 1. 初始化 package.json 文件
npm init -y

下载express包

    # 2. 本地安装 express 到项目中
    # npm install express
    npm i express

使用express快速创建web服务器

// 0. 加载 Express
const express = require('express')

// 1. 调用 express() 得到一个 app
//    类似于 http.createServer()
const app = express()

// 2. 设置请求对应的处理函数
//    当客户端以 GET 方法请求 / 的时候就会调用第二个参数:请求处理函数
app.get('/', (req, res) => {
  res.send('hello world')
})

// 3. 监听端口号,启动 Web 服务
app.listen(3000, () => console.log('app listening on port 3000!'))

托管静态资源-web服务器

 express.static('public')
 // 加载 Express
const express = require('express')

// 1. 调用 express() 得到一个 app
//    类似于 http.createServer()
const app = express();

// 2. 设置请求对应的处理函数
app.use(express.static('public'))


// 3. 监听端口号,启动 Web 服务
app.listen(3000, () => console.log('app listening on port 3000!'))

### 写get接口

get无参数

const express = require('express');
const app = express();
app.get('/get', function(req, res) {
  // 直接返回对象
  res.json({ name: 'abc' });
});
app.listen('8088', () => {
  console.log('8088');
});
​
注意:

    -   res.json()是express提供的方法
    
    ## get接口有参数

express框架会自动收集get方式从url地址中传递的查询字符串参数,并自动保存在req对象的query属性中。我们直接来获取即可。

const express = require('express');
const app = express();
app.get('/get', function(req, res) {
  // 直接返回对象
  console.log(req.query);
  res.send({ name: 'abc' });
});
app.listen('8088', () => {
  console.log('8088');
});

注意:

  • req.query属性是express框架额外提供的属性。

post接口

post接口与get请求不同在于:它的参数一般是通过请求体来传递的。根据传递的参数的格式不同,分成三种情况来说

  • 传递普通键值对
  • 传递form表单(涉及文件上传)
  • 传递json

普通键值对参数

具体来说当content-type为x-www-form-urlencoded时,表示上传的普通简单键值对 。如果通过postman测试的话,对应的设置如下:

image.png

步骤

// 1. 使用中间件
app.use(express.urlencoded());
​
app.post("/add",function(req,res){
    //2. 可以通过req.body来获取post传递的键值对  
    res.json(req.body)
​
})

post接口-json格式的参数

在post传递参数时,如果要传入的参数比较复杂(多级嵌套),则可以使用json格式上传。

var data = {
 name:"abc",
 address:{
     "a":1,
     "b":2,
     "info":"c"
 }
}

postman操作

image.png

后端

app.use(express.json());
// 会自动加入req.body属性,这个属性中就包含了post请求所传入的参数// 用来处理JSON格式的数据
app.post('/postJSON',(req,res)=>{
    // 后端收到post传参
    console.log(req.body);
    
    res.send('/postJSON')
})

post接口-form-data文件上传

如果post涉及文件上传操作,则需要在服务器端额外使用第三方multer这个包(不属于express)来获取上传的信息。

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。

enctype="multipart/form-data"

对应postman的操作如下:

image.png

步骤

1.安装

npm install multer

2.使用 // 1. 引入包 const multer = require('multer'); // 2. 配置 const upload = multer({dest:'uploads/'}) // 上传的文件会保存在这个目录下 // uploads表示一个目录名,你也可以设置成其它的

// 3. 使用 // 这个路由使用第二个参数 .upload.single表示单文件上传, 'cover' 表示要上传的文件在本次上次数据中的键名。对应于前端页面上的: //

app.post("/postfile",upload.single('cover'), function(req,res){ // req.file 记录了文件上传的信息 // req.body 记录了其它普通参数(非文件)的信息 // 其它操作 })

理解接口传参

请求报文

我们一般使用ajax技术向接口传参,按http协议的约定,每个请求都有三个部分:

  • 请求: 保存了请求方式,地址,可以以查询字符串的格式附加一部分数据。

  • 请求:它可以附加很多信息,其中content-type用来约定请求体中保存的数据格式。

    content-type常见有三种取值:

    content-type的值表示请求体的数据格式示例
    application/x-www-form-urlencode普通键值对象a=2&c=1
    application/jsonjson对象{a:1,b:{c:1}}
    multipart/form-data上传文件file
  • 请求: 本次请求携带的参数。至于这些参数到了后端应该如何解析出来,由请求头中的content-type来决定。

image.png

传参途径

  • 方法一:请求行。常见方式如下:

    • 使用ajax技术,通过get方式传参。
    • 在浏览器地址栏中输入接口地址并补充上查询字符串。
  • 方法二:请求体

    • ajax中的post, put, delete可以从请求体中进行传参。

另外,请求头中的content-type用来告之服务器应该以何种方式去解析请求体中的数据。

后端处理

接口的规则是由后端来定的,它会约定接口的名字,参数,格式,方式。

名字: /api

参数:name: 用户名,pwd:密码,avatar头像文件。

格式:formdata.

方式:post

名字: /api2

参数:name: 用户名,pwd:密码

格式:application/x-www-form-encoded (普通键值对)

方式:post

名字: /api3

参数:name: 用户名,pwd:密码

格式:application/json

方式:post

总结

传参方式前端 content-type后端框架express
请求行get方式req.query
请求体application/x-www-form-urlencodeapp.use(express.urlencoded()); req.body
请求体application/jsonapp.use(express.json() ); req.body
请求体multipart/form-data1. 引入包 const multer = require('multer');
2. 配置app.post('/apiname', upload.single() , req.body)