使

使用 Node.js 和 Express.js 设置 REST API

2025-06-10

使用 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
Enter fullscreen mode Exit fullscreen mode

下一步,我们将创建包。

$ yarn init -y
Enter fullscreen mode Exit fullscreen mode

如果您不想回答这些问题,我建议您使用 -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
Enter fullscreen mode Exit fullscreen mode

在继续express.js解释之前,我们将安装sucrasenodemon库。

$ yarn add sucrase nodemon -D
Enter fullscreen mode Exit fullscreen mode

-D 表示将此库安装为开发依赖项。作为开发依赖项的软件包仅在本地开发和测试时需要。您可以在此处阅读更多信息。

我们需要创建一个名为 nodemon.json 的文件:

$ touch nodemon.json
Enter fullscreen mode Exit fullscreen mode

然后将以下行添加到nodemon.json:

  "execMap":{
      "js": "sucrase-node"
    }
Enter fullscreen mode Exit fullscreen mode

此配置将使用 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": {
    ...
  },
  ...
Enter fullscreen mode Exit fullscreen mode

在这种情况下,脚本将使执行一些长命令变得更容易。
例如,我们可以$ nodemon src/server.js使用命令轻松执行命令$ yarn dev

在执行此命令行之前我们需要创建server.js。

设置server.js

本主题中,我们将开始学习如何使用HTTP 请求。所有创建的路由都将在server.js 中。

我们需要创建一个名为src的文件夹和文件server.js

$ mkdir src && cd src && touch server.js
Enter fullscreen mode Exit fullscreen mode

然后在server.js中添加以下几行:

import express from 'express';

class Server{
    constructor(){
        this.app = express();
        this.server();     
    }

    server(){
        this.app.listen(3333);
    }  

}


export default new Server();
Enter fullscreen mode Exit fullscreen mode

在上面的代码中,它具有属性“this.app”来接收所有快速方法和服务器方法来监听来自端口 3333 的请求。

现在我们可以启动服务器了,您应该转到控制台来输入下面的命令行:

$ yarn dev
Enter fullscreen mode Exit fullscreen mode

在路由中,我们将创建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();
Enter fullscreen mode Exit fullscreen mode

routes()中将添加的第一行express.json()

...
routes() {
   this.app.use(express.json());
}
...
Enter fullscreen mode Exit fullscreen mode

express.json文件是接收HTTP POSTPUT 请求(包含JSON 对象)所必需的。当我们开始查看HTTP POSTPUT 请求的示例时,您将会更好地理解。您可以在此处阅读更多内容

在继续之前,我们需要安装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();
Enter fullscreen mode Exit fullscreen mode

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)
          })
}
...
Enter fullscreen mode Exit fullscreen mode

打开浏览器,尝试访问 URL ( http://localhost:3333/users ),获取包含“User01, User02”的数组。该路由期望访问路径 '/users' 并通过 res.json 返回该数组。

替代文本

很简单,对吧?

图像的替代文本

请求和响应对象如何工作?

要求:

req对象表示 HTTP 请求,具有请求查询字符串、参数、正文、HTTP 标头等属性。
参考。

如果我们想在请求中发送一个对象,我们可以使用req.body;如果我们想传递一些参数,我们可以使用req.paramsreq.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])
      })
}
...
Enter fullscreen mode Exit fullscreen mode

打开浏览器并尝试访问 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))
   })
}
...
Enter fullscreen mode Exit fullscreen mode

首先改变的是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)
   })
}
...
Enter fullscreen mode Exit fullscreen mode

打开你的 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)
 })
}
...
Enter fullscreen mode Exit fullscreen mode

打开 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)
  }) 
}
...
Enter fullscreen mode Exit fullscreen mode

打开你的 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 请求是客户不满意订单并请求取消订单。

是的,我们做到了!

图像的替代文本

我们完成了教程,我希望我能为您漫长的知识历程做出贡献。

您可以在此处访问该项目

下篇教程再见!

图像的替代文本

鏂囩珷鏉ユ簮锛�https://dev.to/souzamarlon/setting-up-a-rest-api-with-node-js-and-express-js-3fl2
PREV
你喜欢怎么学编程?你在 Twitch 上看过 Fritz 吗?Immo Landweth
NEXT
如何通过 Sourcegraph 代码搜索学习 React API 和概念