对于node.js来说,Express 是一个第三方模块,有丰富的 API 支持强大而灵活的中间件特性,Express 不对 Node.js 已有的特性进行二次抽象,只是在它之上扩展了 Web 应用所需的基本功能
我们前面用http模块来支持web服务,写接口 ----- 原生js
现在要用express来写web服务,写接口 ------ jQuery
Express搭建简单接口
要创建本地项目 在下载 express插件npm i express (注意:目目录名字不要取中文,也不要取express)
搭建普通接口
// 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!'))
app.get('/')相当于添加个事件监听:当用户以get方式求"/"时,它后面的回调函数会执行,其回调函数中的req,res与前面所学http模块保持一致
res.send()是exprss框架给res对象补充提供的方法(http模块中的res是没有这个方法的),用于结束本次请求。类似的还有res.json(),res.sendFile() 。
托管静态资源
让用户直接访问静态资源是一个web服务器最基本的功能 使用 app.use(express.static('文件名')) 使用这个可以实现资源额静态托管 他可以设置前缀 app.use('/public', express.static('public')) 这意味着想要访问public下的内容,必须要在请求url中加上/public
接口与路由
路由(Routing)是一组映射关系。它约定了当一个特定的 HTTP 方法(GET、POST 等)访问某个 URL(或者叫路径标识)时,服务器如何响应 app.请求方式('路径', 处理的回调函数) 例如:app.get('/',function=>{}) 写接口就是一种特殊的路由
const express = require('express');
const app = express();
// 路由
app.get('/get', function(req, res) {
// 处理逻辑 res.json是e xpress提供的方法 发送一个json的响应
res.json({ name: 'abc' });
});
// 开启这个服务器
app.listen('8088', () => {
console.log('8088');
});
res.json() 发送一个json的相应 与res.end 有异曲同工之妙
req.query 属性 :是express框架会自动收集get方式从url地址中传递的查询字符串参数,并自动保存在req对象的query
属性中。我们直接来获取即可。
小试牛刀
// 引入express
const express = require('express')
// 创建实例
const app = express()
// 配置请求方式 和 URL地址
app.get('/api/getlist', function(req, res) {
// 返回数据 res.json()
// 将静态数据保存到 常量中
const books = [{
id: 1, //图书id
bookname: "西游记", //书名
author: "吴承恩", //作者
publisher: "北京出版社", //出版社
}
];
// 开始判断 URL中是否带有id 如果带了 就去寻找准确的值 如果没带 则就将全部的都返回出去
if (req.query.id !== undefined) {
const book = books.find(item => item.id == req.query.id); // find篇文章讲解
// find在数组中找满足条件的第一个元素,找到就返回元素 找补到就返回 null
if (book) { // 如果不为空 就将这个返回出去
res.json({
"status": 0, //0标识成功
"message": "获取图书列表数据成功", //描述信息
"data": book // 成功后的 查询结果
})
} else { // 没找到就会显示失败
res.json({
"status": 1, // 其他失败
"message": "找不到这本书", //描述信息
})
}
} else { // 没有准确的 id 将其所有返回出去
const data = {
"status": 0, //0标识成功,其他失败
"message": "获取图书列表数据成功", //描述信息
"data": books //返回数据
}
res.json(data)
}
})
// 开启服务器
app.listen(8080, () => {
console.log("已启动");
});
写接口-post接口
app.post('地址',(req,res)=>{回调函数})
1.get一般用来做查询 post用来做添加 2.传参不同:get的参数只能在请求行中通过查询字符串来传递, post一般是通过请求体(它也可以通过请求行来传递)来传递的。 Delete来做删除 put做编辑
2.post根据传递的参数的格式不同,分成三种情况来说 传递普通键值对 传递json
传递form表单(涉及文件上传)
1.传递普通键值对: 用app.use(express.urlencoded())来获取请求体的参数。 然后参数 会自动放在 req.body里面 express.urlencoded()是中间键是为了增强express的功能把传来的数据放在 req.body内
2.传递json:使用app.use(express.json()) 来获取请求体中的数据
3.传递form-Data表单(涉及文件上传):Multer 是一个node.js 中间件,用于处理 multipart/form-data
类型的表单数据,它主要用于上传文件 涉及文件上传操作,则需要在服务器端额外使用第三方multer
这个包(不属于express)来获取上传的信息
安装包 npm install multer 引入包 : const multer = require('multer');
const upload = multer({dest:'uploads/'}) 上传的文件会保存在这个目录下 uploads表示一个目录名,你也可以设置成其它的
3. 使用
这个路由使用第二个参数 .upload.single表示单文件上传, 'cover' 表示要上传的文件在本次上次数据中的键名。对应于前端页面上的:<input type="file" name='cover'/>
app.post("/postfile", upload.single('cover'), function(req,res){req.file 记录了文件上传的信息 req.body 记录了其它普通参数(非文件)的信息 其它操作})
如果当前目录下没有uploads,它会自动创建uploads这个文件夹 upload.single只是处理了文件的上传。你仍可以通过req.body来获取其它参数
理解接口传参
请求报文:行,头,体
我们一般使用ajax技术请求接口,按http协议的约定,每个请求都有三个部分:
请求行: 保存了请求方式,地址,可以以查询字符串的格式附加小部分数据。
请求头:它可以附加很多信息,其中content-type用来约定请求体中保存的数据格式。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来决定。
总结
传参方式 | 前端 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) |