likes
comments
collection
share

使用 PostgreSQL 和 Node Js 进行接口操作的简单教程

作者站长头像
站长
· 阅读数 14

在本文中,我们将学习以下内容

  1. 使用 Express 创建 Node Js 服务器
  2. 创建简单的 CURD API
  3. 与 PostgreSQL 数据库集成
  4. 从 API 向数据库发送和接收数据

让我们开始吧

步骤 1 先决条件

我们需要以下内容来跟随本教程

  1. Node JS 和 Express Js
  2. 数据库
  3. 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

使用 PostgreSQL 和 Node Js 进行接口操作的简单教程

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"}]

使用 PostgreSQL 和 Node Js 进行接口操作的简单教程

从数据库中获取特定专辑的 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 的相册

使用 PostgreSQL 和 Node Js 进行接口操作的简单教程

现在我们已经构建了更新数据的 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 的相册

使用 PostgreSQL 和 Node Js 进行接口操作的简单教程

结论

在本文中,我们使用 nodejs 和 PostgreSQL 创建了一个 REST API 服务器。我们创建了 API 来创建、更新和删除数据。我们还将数据存储在数据库中,并从数据库中检索数据

我希望你发现这篇文章很有用

转载自:https://juejin.cn/post/7245812754027692088
评论
请登录