첫 번째 튜토리얼 "RESTful API 이해"에서는 REST 아키텍처가 무엇인지, HTTP 요청 방법과 응답이 무엇인지, RESTful API 엔드포인트를 이해하는 방법을 배웠습니다. 두 번째 튜토리얼인 "Express API 서버를 설정하는 방법"에서는 Node에 내장된http
모듈과 Express 프레임워크를 사용하여 서버를 구축하는 방법과 우리가 만든 애플리케이션을 다른 URL 엔드포인트로 라우팅하는 방법을 배웠습니다.
현재 API 엔드포인트가 전달되면GET
请求命中时,我们使用静态数据以 JSON 源的形式显示用户信息。在本教程中,我们将设置一个 MySQL 数据库来存储所有数据,从 Node.js 应用程序连接到数据库,并允许 API 使用GET
、POST
、PUT
,和DELETE
메소드가 완전한 API를 생성합니다.
지금까지 우리는 데이터를 저장하거나 조작하기 위해 데이터베이스를 사용한 적이 없으므로 데이터베이스를 설정하겠습니다. 이 튜토리얼에서는 MySQL을 사용합니다. 컴퓨터에 이미 MySQL이 설치되어 있는 경우 다음 단계를 계속할 수 있습니다.
MySQL이 설치되어 있지 않은 경우 무료 로컬 서버 환경과 데이터베이스를 제공하는 macOS 및 Windows용 MAMP를 다운로드할 수 있습니다. 다운로드가 완료되면 프로그램을 열고Start Server를 클릭하여 MySQL을 시작하세요.
MySQL 자체를 설정하는 것 외에도 데이터베이스와 테이블을 보려면 GUI 소프트웨어도 필요합니다. Mac의 경우 SequelPro를 다운로드하고 Windows의 경우 SQLyog를 다운로드하세요. MySQL을 다운로드하고 실행한 후 포트3306
上使用用户名root
和密码root
连接到localhost
에서 SequelPro 또는 SQLyog를 사용할 수 있습니다.
여기서 모든 것이 설정되면 API용 데이터베이스 설정으로 넘어갈 수 있습니다.
데이터베이스 보기 소프트웨어에서 새 데이터베이스를 추가하고 이름을api
。确保 MySQL 正在运行,否则您将无法连接到localhost
지정합니다.
데이터베이스를 생성한 후api
해당 데이터베이스로 이동하고 다음 쿼리를 실행하여 새 테이블을 생성합니다.
이 SQL 쿼리는users
테이블의 구조를 생성합니다. 각 사용자는 자동으로 증가하는 ID, 이름 및 이메일 주소를 갖게 됩니다.
또한INSERT
쿼리를 실행하여 정적 JSON 배열을 통해 현재 표시된 동일한 데이터로 데이터베이스를 채울 수도 있습니다.
id
필드는 자동으로 증가하므로 입력이 필요하지 않습니다. 이제 사용할 수 있는 테이블 구조와 일부 샘플 데이터가 생겼습니다.
애플리케이션으로 돌아가서 데이터 처리를 시작하려면 Node.js에서 MySQL에 연결해야 합니다. 이전에는mysql
npm 모듈을 설치했는데 이제 이를 사용하겠습니다.
data라는 새 디렉터리를 만들고config.js파일을 만듭니다.
먼저data/config.js에mysql
모듈이 필요합니다.
호스트, 사용자, 비밀번호, 데이터베이스를 포함하는config
개체를 만들어 보겠습니다. 이는 우리가 만든config
对象,其中包含主机、用户、密码和数据库。这应该引用我们制作的api
데이터베이스를 참조하고 기본 localhost 설정을 사용해야 합니다.
효율성을 높이기 위해 여러 연결을 수동으로 열고 닫을 필요 없이 한 번에 여러 연결을 사용할 수 있는 MySQL 풀을 만들겠습니다.
으아아아마지막으로 애플리케이션에서 사용할 수 있도록 MySQL 풀을 내보냅니다.
으아아아GitHub 저장소에서 전체 데이터베이스 구성 파일을 볼 수 있습니다.
이제 MySQL에 연결하고 설정이 완료되었으므로 API를 통해 데이터베이스와 계속 상호 작용할 수 있습니다.
현재routes.js
파일은 아래와 같이 사용자의 JSON 배열을 수동으로 생성하고 있습니다.
더 이상 정적 데이터를 사용하지 않으므로 전체 배열을 삭제하고 MySQL 풀에 대한 링크로 교체할 수 있습니다.
으아아아이전에는/users
경로의GET
가 정적/users
路径的GET
发送静态users
数据。我们更新后的代码将改为在数据库中查询该数据。我们将使用 SQL 查询SELECT
来自users
데이터를 보냈습니다. 업데이트된 코드는 대신 이 데이터에 대해 데이터베이스를 쿼리합니다. 아래와 같이
SELECT
를 사용하겠습니다.
으아아아/users
获取路由的样子,使用pool.query()
이것이 우리의 새로운
으아아아SELECT
查询,然后通过/users
端点将结果以 JSON 形式发送到客户端。如果您重新启动服务器并导航到/users
여기서
到目前为止,我们的端点都是静态路径 -/
root 或/users
- 但是当我们只想查看有关特定用户的数据时该怎么办?我们需要使用可变端点。
对于我们的用户,我们可能希望根据每个用户的唯一 ID 检索有关每个用户的信息。为此,我们将使用冒号 (:
) 来表示它是一个路由参数。
// Display a single user by ID app.get('/users/:id', (request, response) => { ... }); });
我们可以使用request.params
属性检索此路径的参数。由于我们的名称为id
,因此我们将这样引用它。
const id = request.params.id;
现在,我们将在SELECT
语句中添加WHERE
子句,以仅获取具有指定id
的结果。
我们将使用?
作为占位符以避免 SQL 注入,并将 id 作为参数传递,而不是构建一个连接字符串,这会降低安全性。
pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); });
我们个人用户资源的完整代码现在如下所示:
// Display a single user by ID app.get('/users/:id', (request, response) => { const id = request.params.id; pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); }); });
现在您可以重新启动服务器并导航到https://localhost/users/2
以仅查看 Gilfoyle 的信息。如果出现Cannot GET /users/2
之类的错误,则说明您需要重新启动服务器。
访问此 URL 应返回一个结果。
[{ id: 2, name: "Bertram Gilfoyle", email: "gilfoyle@piedpiper.com" }]
如果您看到的是这样的内容,那么恭喜您:您已成功设置动态路由参数!
到目前为止,我们所做的一切都使用了GET
请求。这些请求是安全的,这意味着它们不会改变服务器的状态。我们只是查看 JSON 数据。
现在我们将开始通过使用POST
请求添加新数据来使 API 真正动态化。
我之前在理解 REST 文章中提到,我们不会在 URL 中使用add
或delete
等动词来执行操作。为了向数据库添加新用户,我们将POST
到我们查看它们的同一 URL,但只需为其设置一个单独的路由。
// Add a new user app.post('/users', (request, response) => { ... });
请注意,我们现在使用app.post()
而不是app.get()
。
由于我们是创建而不是读取,因此我们将在此处使用INSERT
查询,就像我们在数据库初始化时所做的那样。我们将整个request.body
发送到 SQL 查询。
pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error;
我们还将指定响应的状态为201
,它代表Created
。为了获取最后插入的项目的 id,我们将使用insertId
属性。
response.status(201).send(`User added with ID: ${result.insertId}`);
我们的整个POST
接收代码将如下所示。
// Add a new user app.post('/users', (request, response) => { pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error; response.status(201).send(`User added with ID: ${result.insertId}`); }); });
现在我们可以通过发送一个POST
请求了。大多数情况下,当您发送POST
请求时,您是通过 Web 表单执行的。我们将在本文末尾学习如何进行设置,但发送测试POST
的最快、最简单的方法是使用 cURL,使用-d (--data)
标志。
我们将运行curl -d
,后跟包含所有键/值对和请求端点的查询字符串。
curl -d "name=Dinesh Chugtai&email=dinesh@piedpiper.com" http://localhost:3002/users
发送此请求后,您应该会从服务器收到响应。
User added with ID: 3
如果您导航到http://localhost/users
,您将看到添加到列表中的最新条目。
POST
对于添加新用户很有用,但我们希望使用PUT
来修改现有用户。PUT
是幂等的,这意味着您可以多次发送相同的请求,并且只会执行一个操作。这与POST
不同,因为如果我们多次发送新用户请求,它会不断创建新用户。
对于我们的 API,我们将设置PUT
以便能够处理编辑单个用户,因此这次我们将使用:id
路由参数。
让我们创建一个UPDATE
查询,并确保它仅适用于带有WHERE
子句的请求 ID。我们使用两个?
占位符,我们传递的值将按顺序排列。
// Update an existing user app.put('/users/:id', (request, response) => { const id = request.params.id; pool.query('UPDATE users SET ? WHERE id = ?', [request.body, id], (error, result) => { if (error) throw error; response.send('User updated successfully.'); }); });
在我们的测试中,我们将编辑用户2
并将电子邮件地址从 gilfoyle@piedpiper.com 更新为 bertram@piedpiper.com。我们可以再次使用 cURL,并使用[-X (--request)]
标志来明确指定我们要通过其发送 PUT 请求。
curl -X PUT -d "name=Bertram Gilfoyle" -d "email=bertram@piedpiper.com" http://localhost:3002/users/2
请确保在发送请求之前重新启动服务器,否则您将收到Cannot PUT /users/2
错误。
你应该看到这个:
User updated successfully.
现在应该更新 ID 为2
的用户数据。
我们完成 API 的 CRUD 功能的最后一个任务是选择从数据库中删除用户。此请求将使用DELETE
SQL 查询和WHERE
,并且它将删除由路由参数指定的单个用户。
// Delete a user app.delete('/users/:id', (request, response) => { const id = request.params.id; pool.query('DELETE FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send('User deleted.'); }); });
我们可以再次使用-X
和 cURL 来发送删除。让我们删除我们创建的最新用户。
curl -X DELETE http://localhost:3002/users/3
您将看到成功消息。
User deleted.
导航到http://localhost:3002
,您会看到现在只有两个用户。
恭喜!至此,API就完成了。访问 GitHub 存储库以查看routes.js的完整代码。
request
模块发送请求在本文的开头,我们安装了四个依赖项,其中之一是request
模块。您可以创建一个包含所有数据的新文件并将其发送,而不是使用 cURL 请求。我将创建一个名为post.js的文件,该文件将通过POST
创建一个新用户。
const request = require('request'); const json = { "name": "Dinesh Chugtai", "email": "dinesh@piedpiper.com", }; request.post({ url: 'http://localhost:3002/users', body: json, json: true, }, function (error, response, body) { console.log(body); });
我们可以在服务器运行时在新的终端窗口中使用node post.js
来调用它,它与使用 cURL 具有相同的效果。如果 cURL 出现问题,request
模块很有用,因为我们可以查看错误、响应和正文。
通常,POST
和其他改变服务器状态的 HTTP 方法是使用 HTML 表单发送的。在这个非常简单的示例中,我们可以在任何地方创建一个index.html文件,并为姓名和电子邮件地址创建一个字段。表单的操作将指向资源,在本例中为http//localhost:3002/users
,我们将方法指定为post
。
创建index.html并向其中添加以下代码:
在浏览器中打开此静态 HTML 文件,填写该文件,然后在服务器在终端中运行时发送它。您应该会看到添加了 ID 为 4
的用户的响应,并且您应该能够查看新的用户列表。
在本教程中,我们学习了如何将 Express 服务器连接到 MySQL 数据库,并设置与路径和动态路由的GET
、POST
、PUT
和DELETE
方法相对应的路由参数。我们还学习了如何使用 cURL、Node.jsrequest
模块和 HTML 表单向 API 服务器发送 HTTP 请求。
此时,您应该非常了解 RESTful API 的工作原理,并且您现在可以使用 Express 和 MySQL 在 Node.js 中创建自己的成熟 API!
위 내용은 Node.js 및 Express를 사용하여 첫 번째 API 작성: 데이터베이스에 연결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!