express 初探
文章目录
起始
npm i express // 安装
// 方式 1 -- 配合 http 模块使用
const express = require('express');
const http = require('http');
const app = express(); // 创建一个 express 应用
// app 实际是一个函数,用于处理请求的函数
const server = http.createServer(app);
const port = 9999;
server.listen(port, () => console.log(`server listening on ${
port}...`));
// 方式 2
const express = require('express');
const app = express(); // 内部使用了 http 模块
const port = 9999;
app.listen(port, () => console.log(`server listening on ${
port}...`));
配置
// 根据不同的配置,交给不同的处理函数进行处理
const express = require('express');
const app = express();
// 配置一个请求映射,如果请求方法和请求路径均满足匹配,就交给对应的处理函数进行处理
// app.请求方法("请求路径", 处理函数);
app.get('./news/:id', (req, resp) => {
// req 和 resp 是经过 express 封装过后的请求 / 响应对象
console.log(req.headers); // 获取请求头
console.log(req.path); // 获取请路径
console.log(req.query); // 获取查询值,并封装成对象
console.log(req.params); // 获取动态路径值 如请求路径是 ./news/9527 => { id: '9527' }
// 响应
resp.send(); // 响应结果,内部会调用 end
/**
* send 里是字符串 -> 自动设置 Content-Type: text/html
* 若是数组或对象什么的内容,则会设置 Content-Type: application/json
*/
resp.setHeader(); // 手动设置响应头
resp.status(302).header('location', "https://www.baidu.com").end(); // 设置状态码,重定向到百度
// 语法糖 - 简化上句代码
resp.status(302).location("https://www.baidu.com").end();
// 或
resp.redirect(302, "https://www.baidu.com"); // 默认 301 永久重定向
});
app.get("*", (req, res) => {
// 匹配所有路径的 get 请求
// ...
});
REST API
摘自 → 简书
-
api 与用户的通信协议,总是使用 HTTPS 协议以保证数据传输的安全性。
-
应该尽量将 api 部署在专用域名之下 -
https://api.xxx.com
-
如果 api 很简单,不会有进一步的扩展,可以放在主域名之下 -
https://xxx.com/api/
-
应该将 api 的版本号放入 url -
https://api.xxx.xom/version1/
另一种做法是将版本号放入 http 头信息之中,但不如在 url 中直观 -
路径(EndPoint) - 表示 api 的具体网址。
-
在 RESTful 架构中,每个网址代表一种资源(resource),所以网址中只能有名词,而且名词往往对应数据库表。所以 api 中的名词一般使用复数名词。
-
对于资源的具体操作类型,由 http 动词表示(常用的有下面 5 个):
GET (SELECT) ------- 从服务器取出资源(一项或多项)。
POST(CREATE) ----- 在服务器新建一个资源。
PUT(UPDATE) ------ 在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE) ---- 在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE) — 从服务器删除资源。
以及两个不常用的 http 动词 – HEAD / OPTIONS例如:
统一的 api 接口,通过不同的请求方法完成操作
/api/student ----------- post ---------- 添加学生
/api/student ----------- get ----------- 获取学生信息
/api/student/:id ------- get ----------- 获取某个学生信息
/api/student ----------- put ----------- 修改学生信息
/api/student/:id ------- put ----------- 修改某个学生信息
/api/student ----------- delete -------- 删除学生
… 依次类推
-
-
过滤信息
如果存在数据量很大,不可能全部返回给客户端。所以通过 api 提供参数,过滤结果
?limit=10 -------------- 指定返回 10 条数据
?offset=10 ------------- 指定跳过 10 条
?page=x&per_page=y ----- 指定第 x 页,及每页数据量
… 以及一些其他筛选条件参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如:
GET /zoo/ID/animals
与GET /animals?zoo_id=ID
的含义是相同的。 -
状态码: 服务器向用户返回的状态码和提示信息(常见的 200, 301, 302, 400, 403, 404, 500等)
-
错误处理:状态码是
4xx
,就应该向用户返回错误信息。 -
返回结果:针对不同的操作,服务器向用户返回的结果应该符合以下规范:
GET ------ /collection:返回资源对象的列表(数组)
GET ------ /collection/resource:返回单个资源对象
POST ----- /collection:返回新生成的资源对象
PUT ------ /collection/resource:返回完整的资源对象
PATCH ---- /collection/resource:返回完整的资源对象
DELETE — /collection/resource:返回一个空文档 -
Hypermedia api: 即返回结果中提供链接,连向其他 api 的方法,使用户不用去查文档。
-
服务器返回的数据格式,应尽量使用 json,避免使用 xml
nodemon
它是一个监视器
,用于监控工程中的文件变化,如果发现文件有变化,可以执行一段脚本。(node 环境下就可以使用)
即之前更改文件后,需要停掉程序,重新跑一遍;用它可以帮我们省去这一步:
但同时,它会监听任何文件的变更(比如 package.json 更改也会让它重新运行),所以可以配置一个 nodemon.json