在本文中,我们将学习以下内容
- 使用 Express 创建 Node Js 服务器
- 创建简单的 CURD API
- 与 PostgreSQL 数据库集成
- 从 API 向数据库发送和接收数据
让我们开始吧
步骤 1 先决条件
我们需要以下内容来跟随本教程
- Node JS 和 Express Js
- 数据库
- JavaScript知识
第 2 步:设置系统并安装依赖项
创建一个新目录并命名它 rest-api-node-postgresql
然后 cd
进入它。
然后在你的终端输入命令 npm init 来初始化一个新项目
初始化项目后,将创建 package.json 文件,它应该看起来像这样。
在初始化项目时,您可以选择任何您想要的设置,除了主入口文件应该是 index.js
{
"name": "rest-api-node-postgresql",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC"
}
现在,让我们安装 express web 框架。在您的终端上键入以下命令以安装 express 并将其保存为依赖项
npm install express --save
现在让我们启动服务器。将以下代码粘贴到您的 index.js 文件中
const express = require('express')
const app = express()
const port = 8080
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
我们现在有一个运行在端口 8080 上的服务器
安装 PG:Node Js 的 Postgres 客户端
接下来,让我们 pg
为 node js 安装 Postgres 客户端。在您的终端中键入以下命令
npm install pg --save
第 3 步:设置数据库连接
我们已经启动了服务器并为 node js 安装了 pg 客户端,现在让我们建立与数据库的连接
建立数据库连接首先你需要一个数据库。我已经使用 docker 桌面在 docker 容器中安装了 Postgresql 数据库
在接下来的几个步骤中,我将解释如何在 docker 中设置数据库。如果您正在运行数据库或者您知道如何在 docker 中设置数据库,则可以跳过此步骤
在 docker 容器中设置本地 PostgreSQL 数据库
在你的机器上安装docker,然后打开终端
A。从 docker hub 拉取数据库镜像
键入以下代码以在 docker 容器中安装 PostgreSQL 数据库
docker pull postgres
这将从 docker hub 中拉取最新的 Postgres 图像
b. 为数据库存储创建专用卷
然后在您的机器中创建一个专用卷用于数据库存储以实现数据持久性
键入以下命令以创建专用卷
docker volume create postgresvol
C。启动数据库
运行以下命令启动数据库
docker run --name database-postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -v postgresvol:/var/lib/postgresql/data -d postgres
我们在这段代码中做什么
我们将我们的容器数据库命名为 postgres,并将数据库的密码设置为 Postgres,并将运行数据库的容器端口绑定到我们的本地计算机端口5432
最后,我们将创建的 postgresvol 卷挂载到容器/var/lib/postgresql/
数据目录
d. 访问数据库
键入以下命令以访问数据库
docker ps
docker ps 命令列出了容器的数量,您可以在那里看到正在运行的数据库容器
要访问数据库,请键入以下命令
psql -h localhost -p 5432 -U postgres
现在我们已经在 docker 容器中建立了本地数据库,让我们继续我们的应用程序
从我们的 Node Js 服务器配置数据库
现在我们已经启动了数据库服务器。现在让我们从我们的 nodejs 服务器连接到服务器并创建一个名为 albums 的数据库表
index.js
在你的文件中写入以下代码
const express = require('express')
const { Pool } = require('pg');
const app = express()
const port = 8080
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'postgres',
password: 'postgres',
port: 5432,
});
app.use(express.json());
async function createAlbumsTable() {
try {
const query = `
CREATE TABLE IF NOT EXISTS albums (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
artist VARCHAR(255) NOT NULL,
price NUMERIC(10, 2)
);
`;
await pool.query(query);
console.log('Albums table created');
} catch (err) {
console.error(err);
console.error('Albums table creation failed');
}
}
createAlbumsTable();
那么,我们在这里做什么
我们需要 pg 作为依赖项
我们正在创建一个新池并连接到我们的数据库
然后我们使用 express.json
中间件来解析json
之后我们编写了一个函数来检查我们的数据库中是否存在名为 album 的表,如果不存在则创建一个名为 albums 的表
表中的变量是,id,title,artist name 和 price
然后我们查询表已创建的池和控制台日志
如果由于某种原因我们无法创建表,我们会将错误记录到控制台
步骤 4 创建路由
现在我们已经连接到数据库并创建了相册表,让我们创建一些 API 路由来获取、更新、发布和删除相册,基本上是 CURD API
发送接口
让我们首先创建一个 POST API 来接收专辑数据并将其存储在我们的 Postgres 数据库中
将以下代码粘贴到您的index.js
文件中
app.post('/albums', async (req, res) => {
// Validate the incoming JSON data
const { title, artist, price } = req.body;
console.log(req.body);
if (!title || !artist || !price) {
return res.status(400).send('One of the title, or artist, or price is missing in the data');
}
try {
// try to send data to the database
const query = `
INSERT INTO albums (title, artist, price)
VALUES ($1, $2, $3)
RETURNING id;
`;
const values = [title, artist, price];
const result = await pool.query(query, values);
res.status(201).send({ message: 'New Album created', albumId: result.rows[0].id });
} catch (err) {
console.error(err);
res.status(500).send('some error has occured');
}
});
那么,这是做什么的
此 API 端点接收 JSON 数据并将数据传输为常量标题、艺术家和价格。
然后检查 if 语句是否全部存在。即使上述 const 之一为空,API 也会拒绝数据并以 400 个缺失字段的状态进行响应
在检查数据是否正确后,API 尝试将数据插入数据库表 albums
如果成功,它会返回一个与保存在数据库中的条目相关的 ID
之后,API 会返回状态 201 相册已成功创建并带有相册 ID,或者如果发生某些错误,API 会返回状态 500 发生错误
现在我们已经创建了一个 POST API,到目前为止的完整代码如下所示
const express = require('express')
const { Pool } = require('pg');
const app = express()
const port = 8080
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'postgres',
password: 'postgres',
port: 5432,
});
app.use(express.json());
async function createAlbumsTable() {
try {
const query = `
CREATE TABLE IF NOT EXISTS albums (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
artist VARCHAR(255) NOT NULL,
price NUMERIC(10, 2)
);
`;
await pool.query(query);
console.log('Albums table created');
} catch (err) {
console.error(err);
console.error('Albums table creation failed');
}
}
createAlbumsTable();
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.post('/albums', async (req, res) => {
// Validate the incoming JSON data
const { title, artist, price } = req.body;
console.log(req.body);
if (!title || !artist || !price) {
return res.status(400).send('One of the title, or artist, or price is missing in the data');
}
try {
// try to send data to the database
const query = `
INSERT INTO albums (title, artist, price)
VALUES ($1, $2, $3)
RETURNING id;
`;
const values = [title, artist, price];
const result = await pool.query(query, values);
res.status(201).send({ message: 'New Album created', albumId: result.rows[0].id });
} catch (err) {
console.error(err);
res.status(500).send('some error has occured');
}
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
例子
现在让我们尝试向 API 发送一些数据并查看返回的内容。我正在使用 postman 发送数据,但您也可以使用 postman 或 curl 将数据发送到 api
GET API 从数据库中获取所有相册
现在我们已经创建了一个 post API 来将数据发送到服务器并保存在数据库中
现在让我们创建一个获取所有专辑 API 端点 /albums
当在此端点收到请求时,服务器将从数据库表中获取所有行并以 JSON 格式返回给用户
将此代码粘贴到您的 index.js 文件中
app.get('/albums', async (req, res) => {
try {
const query = 'SELECT * FROM albums;';
const { rows } = await pool.query(query);
res.status(200).json(rows);
} catch (err) {
console.error(err);
res.status(500).send('failed');
}
});
我们在这段代码中做什么
我们在 /albums 端点收到一个请求,我们尝试从我们的数据库中获取专辑表中的所有数据,将该数据转换为 json 并将数据发送到状态码为 200 的前端
如果有错误我们重新调整失败以及状态代码 500
让我们尝试获取所有专辑。您可以使用浏览器以及使用 Postman 或 curl 进行尝试
使用浏览器转到[localhost](http://localhost)://8080/albums
,您将获得返回的 JSON 数据
"id":1,"title":"sdkfjkl","artist":"hello world","price":"19.99"},{"id":2,"title":"cool man","artist":"awesome man","price":"20.00"}]
从数据库中获取特定专辑的 API
我们可以创建一个端点,我们可以通过 id 查询特定相册
为此,请编写以下代码
app.get('/albums/:id', async (req, res) => {
try {
const { id } = req.params;
const query = 'SELECT * FROM albums WHERE id = $1;';
const { rows } = await pool.query(query, [id]);
if (rows.length === 0) {
return res.status(404).send('this album is not in the database');
}
res.status(200).json(rows[0]);
} catch (err) {
console.error(err);
res.status(500).send('failed');
}
});
我们在这里做什么
我们在 /albums/:id 上收到请求,例如 /albums/1 等,然后我们从请求中提取 ID 并在数据库中查询特定专辑
找到相册后,我们会将状态为 200 的相册发送到前端
如果我们在数据库中找不到相册,我们将发送状态 404 以及相册不在数据库中的消息
如果出现错误,我们将发送失败消息以及状态 500
更新相册的API
编写此代码以使用 id 更新相册
app.put('/albums/:id', async (req, res) => {
try {
const { id } = req.params;
const { title, artist, price } = req.body;
if (!title && !artist && !price) {
return res.status(400).send('provide a field (title, artist, or price)');
}
const query = `
UPDATE albums
SET title = COALESCE($1, title),
artist = COALESCE($2, artist),
price = COALESCE($3, price)
WHERE id = $4
RETURNING *;
`;
const { rows } = await pool.query(query, [title, artist, price, id]);
if (rows.length === 0) {
return res.status(404).send('Cannot find anything');
}
res.status(200).json(rows[0]);
} catch (err) {
console.error(err);
res.status(500).send('Some error has occured failed');
}
});
我们在 /albums/id 上收到一个放置请求,我们收到要在正文中以 JSO N 格式更新的数据
我们检查是否有数据,否则我们发送一个字段应该被提供
然后如果有数据我们查询数据库并用新数据更新数据库
如果我们找不到我们发送的表“找不到任何东西”
如果发生错误,我们发送一些错误发生
让我们尝试使用 Postman 更新 id 为 1 的相册
现在我们已经构建了更新数据的 API 让我们知道构建了删除数据的 API
删除相册的API
编写以下代码使用 id 删除相册
app.delete('/albums/:id', async (req, res) => {
try {
const { id } = req.params;
const query = 'DELETE FROM albums WHERE id = $1 RETURNING *;';
const { rows } = await pool.query(query, [id]);
if (rows.length === 0) {
return res.status(404).send('we have not found the album');
}
res.status(200).json(rows[0]);
} catch (err) {
console.error(err);
res.status(500).send('some error has occured');
}
});
在删除 API 中,我们收到删除端点上的数据以及需要删除的相册的 ID
我们查询数据库,删除id为的相册
如果找不到相册,我们会发送状态码 404 以及找不到相册的消息
如果成功删除相册我们将相册数据发送到前端
如果发生错误,我们将发送状态代码 500 以及发生错误的消息
让我们尝试使用 Postman 删除 ID 为 1 的相册
结论
在本文中,我们使用 nodejs 和 PostgreSQL 创建了一个 REST API 服务器。我们创建了 API 来创建、更新和删除数据。我们还将数据存储在数据库中,并从数据库中检索数据
我希望你发现这篇文章很有用