使用 Node.js 和 Express.js 设置 REST API
嘿,
我将向您展示如何使用 Node 和 Express 设置 Rest API。希望您能从本教程中有所收获,而您的反馈也能帮助我有所收获。
要求:
我们走吧!
什么是休息?
REST,即表述性状态转移 (REpresentational State Transfer),是一种架构风格,用于在 Web 上的计算机系统之间提供标准,使系统之间更容易通信。符合 REST 标准的系统(通常称为 RESTful 系统)的特点是无状态,并且将客户端和服务器的关注点分离。我们将深入探讨这些术语的含义,以及它们为何对 Web 服务有益。
参考。
什么是 API?
API 是应用程序编程接口 (Application Programming Interface) 的缩写,它是一种允许两个应用程序相互通信的软件中介。每次你使用 Facebook 等应用程序、发送即时消息或在手机上查看天气时,你都在使用 API。
参考。
启动项目:
第一步是创建一个文件夹来保存我们的项目。
$ mkdir nodejs-express-setup
$ cd node-express-setup
下一步,我们将创建包。
$ yarn init -y
如果您不想回答这些问题,我建议您使用 -y 标志。此标志表示您将接受使用默认选项。
您可以在Yarn cli中或使用控制台中的命令行找到有关yarn init的更多信息。$ yarn --help init
检查文件夹“nodejs-express-setup”,你会发现一个名为package.json的文件,可能你正在问这个问题......
什么是 package.json?
package.json 文件相当于项目的清单。它可以做很多事,但完全不相关。例如,它是工具配置的中央存储库。npm 和 yarn 也在这里存储所有已安装软件包的名称和版本。
参考。
此外,您还可以在Yarn package-json中找到一些信息和提示
我希望这些信息能帮助您了解 package.json 的工作原理。
使用 sucrase 设置 Express.js 和 nodemon。
为什么需要安装这个框架?
好的,让我们开始想象一个移动应用程序或 Web 应用程序,每次这些应用程序需要与我们的后端通信时,它们都会连接到一个 API,这个框架将使我们创建 API 的工作更容易,并提供许多 HTTP 实用方法。
很高兴听到这个...对吧?
现在您知道了安装此框架的原因,我们可以通过运行以下命令行继续安装:
$ yarn add express
在继续express.js解释之前,我们将安装sucrase和nodemon库。
$ yarn add sucrase nodemon -D
-D 表示将此库安装为开发依赖项。作为开发依赖项的软件包仅在本地开发和测试时需要。您可以在此处阅读更多信息。
我们需要创建一个名为 nodemon.json 的文件:
$ touch nodemon.json
然后将以下行添加到nodemon.json:
"execMap":{
"js": "sucrase-node"
}
此配置将使用 execMap 定义我们自己的默认可执行文件。我们将通知nodemon在运行代码之前使用sucrase进行编译,并且每次执行 js 文件时都会执行此操作。
什么是蔗糖酶和nodemon?
Sucrase 是 Babel 的替代品,它允许超快速的开发构建。Sucrase 不会为了在 IE 浏览器中运行而编译大量的 JS 功能,而是假设你正在使用较新的浏览器或较新的 Node.js 版本进行开发,因此它专注于编译非标准语言扩展:JSX、TypeScript 和 Flow。由于范围较小,Sucrase 可以采用性能更高但可扩展性和可维护性较差的架构。
参考。Nodemon 是一款实用程序,可以监视源代码中的任何更改并自动重启服务器。非常适合开发。
可以作为参考。
Nodemon会让我们的开发速度比平时更快,因为它会在每次保存代码时自动重启服务器。
安装两个库后,我们需要再做一项更改。
编辑 package.json 添加以下行:
...
"license": "MIT",
"scripts": {
"dev": "nodemon src/server.js",
"build": "sucrase ./src -d ./dist --transforms imports",
"start": "node dist/server.js"
},
"dependencies": {
...
},
...
在这种情况下,脚本将使执行一些长命令变得更容易。
例如,我们可以$ nodemon src/server.js
使用命令轻松执行命令$ yarn dev
。
在执行此命令行之前我们需要创建server.js。
设置server.js
本主题中,我们将开始学习如何使用HTTP 请求。所有创建的路由都将在server.js 中。
我们需要创建一个名为src的文件夹和文件server.js:
$ mkdir src && cd src && touch server.js
然后在server.js中添加以下几行:
import express from 'express';
class Server{
constructor(){
this.app = express();
this.server();
}
server(){
this.app.listen(3333);
}
}
export default new Server();
在上面的代码中,它具有属性“this.app”来接收所有快速方法和服务器方法来监听来自端口 3333 的请求。
现在我们可以启动服务器了,您应该转到控制台来输入下面的命令行:
$ yarn dev
在路由中,我们将创建HTTP get、post、put、delete 请求。同时,我们还需要添加数组来测试我们的请求。
import express from 'express';
const users = ['User01', 'User02'];
class Server{
constructor(){
this.app = express();
this.server();
this.routes();
}
routes() {
}
server(){
this.app.listen(3333);
}
}
export default new Server();
routes()中将添加的第一行是express.json():
...
routes() {
this.app.use(express.json());
}
...
express.json文件是接收HTTP POST和PUT 请求(包含JSON 对象)所必需的。当我们开始查看HTTP POST和PUT 请求的示例时,您将会更好地理解。您可以在此处阅读更多内容。
在继续之前,我们需要安装cors库:
我们将在未来的教程中使用此项目这个库。
添加以下行:
import express from 'express';
import cors from 'cors';
....
class Server{
constructor(){
...
}
routes() {
this.app.use(express.json());
this.app.use(cors());
}
...
}
export default new Server();
cors 是什么?
跨域资源共享 (CORS) 是一种机制,它使用额外的 HTTP 标头来告知浏览器,允许在一个源(域)上运行的 Web 应用程序访问来自不同源服务器的选定资源。当 Web 应用程序请求与其自身源不同的源(域、协议和端口)的资源时,它将执行跨域 HTTP 请求。
参考
该库对于允许其他应用程序向我们的 API 发出请求是必需的。
路由 HTTP 获取、发布、放置和删除请求:
得到:
我们将开始执行HTTP get 请求。在此示例中,我们将使用不带参数或查询的路由。
...
routes() {
this.app.use(express.json());
this.app.get('/users', (req, res) => {
return res.json(users)
})
}
...
打开浏览器,尝试访问 URL ( http://localhost:3333/users ),获取包含“User01, User02”的数组。该路由期望访问路径 '/users' 并通过 res.json 返回该数组。
很简单,对吧?
请求和响应对象如何工作?
要求:
req对象表示 HTTP 请求,具有请求查询字符串、参数、正文、HTTP 标头等属性。
参考。
如果我们想在请求中发送一个对象,我们可以使用req.body;如果我们想传递一些参数,我们可以使用req.params或req.query。稍后我将解释这两个参数。
回复:
res对象表示Express应用收到 HTTP 请求时发送的 HTTP 响应。
参考。
响应对象主要负责在应用程序每次收到HTTP 请求时提供数据或信息。我们可以使用res.send()或res.json()提供这些数据。
简要说明res.send()和res.json()之间的区别。
Res.send():
此方法根据参数设置内容类型响应头,例如,如果发送的是对象,则头将内容类型设置为 application/JSON,但如果发送的是字符串,则内容类型将为 text/HTML。
您可以在此处找到更多信息
Res.json():
此方法将内容类型响应标头设置为 application/JSON,如果参数是非对象,它也将转换为 JSON。
您可以在此处找到更多信息
如果您在参数中传递对象或数组,您将看不到res.send()和res.json()之间的任何区别,在大多数情况下,这是我们将传递给这些方法的参数类型。
希望您理解了这两种方法的区别。我们可以继续进行下一个解释。
在上一个例子中,我们做了一个没有参数或查询的路由,在这个例子中,我们将做一些带有req.params 和 req.query 的路由。
请求参数:
当我们想要获取数组内的特定数据时,此属性非常有用。
下面,我们使用 req.params 通过索引参数中的值来查找用户。
...
routes() {
this.app.use(express.json());
this.app.get('/users/:index', (req, res) => {
const { index } = req.params;
return res.json(users[index])
})
}
...
打开浏览器并尝试访问 URL ( http://localhost:3333/users/1 ) 来接收字符串“User02”。req.params 通过 index 参数接收值,我们将根据数组索引返回该字符串。
欲了解更多信息,您可以阅读文档
请求查询:
从工作方式来看,此属性与req.params非常相似,但最大的区别在于它允许我们向对象传递更多参数。
...
routes() {
this.app.get('/searchforusers', (req, res) => {
const { index, name } = req.query;
const getUser = users[index];
return res.json(getUser.match(name))
})
}
...
首先改变的是path,我们不再传递任何参数,但这并不意味着我们不能同时使用这两个属性。
此属性通过两个参数传递值,我们使用这些参数在数组中查找特定的字符串。
打开浏览器并尝试访问 URL ( http://localhost:3333/searchforusers?index=0&name=User01 ) 以接收字符串“User01”。在这种情况下,两个参数都需要为 true 才能返回所需的值,因为我们尝试根据数组索引查找用户,如果名称和字符串 getUser 匹配,则返回 null。
欲了解更多信息,您可以阅读文档
邮政:
我们将学习如何使用 HTTP 发布请求在数组中添加新字符串。
在我们开始之前,您应该在路线中添加以下几行。
...
routes() {
this.app.post('/users', (req, res) => {
const { user } = req.body;
users.push(user)
return res.json(users)
})
}
...
打开你的 insomnia 测试 URL(http://localhost:3333/users),然后你需要在 JSON 主体中添加以下行{ "user": "User03" }
。在我们的 HTTP 请求中,我们通过 req.body 发送要添加到数组中的字符串。
该路径类似于第一个HTTP 获取请求示例,但我们使用的是不同的方法。
欲了解更多信息,您可以阅读文档
请求主体:
此属性非常有用,因为我们可以在HTTP 请求的对象内部传递许多参数。
欲了解更多信息,您可以阅读文档
放:
使用HTTP 放置请求可以轻松更新数组内的字符串。
在我们开始之前,您应该在路线中添加以下几行:
...
routes() {
this.app.put('/users/:index', (req, res) => {
const { index } = req.params;
const { user } = req.body;
users[index] = user;
return res.json(users)
})
}
...
打开 insomnia 并粘贴 URL(http://localhost:3333/users/0),然后在 JSON 主体中添加以下行{ "user": "NewUser01" }
。我们通过 req.body 发送字符串,以根据数组索引更新数组。
当我们想要更新数组中的特定字符串时,HTTP put 请求非常有用,参数index很重要,它用于标识数组的哪个索引将使用通过req.body接收的字符串进行更新。
欲了解更多信息,您可以阅读文档
删除:
如果我们想从数组中删除一个字符串,我们可以使用HTTP 删除请求。
在我们开始之前,您应该在路线中添加以下几行。
...
routes() {
this.app.delete('/users/:index', (req, res) => {
const { index } = req.params;
users.splice(index, 1);
return res.json(users)
})
}
...
打开你的 insomnia 插件,粘贴 URL ( http://localhost:3333/users/0 ),并接收不包含字符串“NewUser01”的数组。*req.params通过index 参数接收值,并根据数组索引从数组中删除该字符串。*
与HTTP 放置请求的相似性很明显,但确定我们在请求中使用哪个操作非常重要。
欲了解更多信息,您可以阅读文档
结论:
在本教程中,我们学习了如何创建一个新的节点项目,使用sucrase设置 express 和nodemon,以及如何使用express方法和属性。
和...
将 The Office 的 Dunder Mifflin 纸业公司与 REST API 进行类比。HTTP
get 请求是客户端请求获取所有待处理订单或单个特定订单的信息。HTTP
post 请求是销售人员正在招募新客户。HTTP
put 请求是客户端请求更新订单中纸张的数量。HTTP
delete 请求是客户不满意订单并请求取消订单。