运行第一个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测试的话,对应的设置如下:
步骤
// 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操作
后端
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的操作如下:
步骤
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/json json对象 {a:1,b:{c:1}} multipart/form-data 上传文件 file -
请求体: 本次请求携带的参数。至于这些参数到了后端应该如何解析出来,由请求头中的content-type来决定。
传参途径
-
方法一:请求行。常见方式如下:
- 使用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-urlencode | app.use(express.urlencoded()); req.body |
| 请求体 | application/json | app.use(express.json() ); req.body |
| 请求体 | multipart/form-data | 1. 引入包 const multer = require('multer'); 2. 配置app.post('/apiname', upload.single() , req.body) |