使用 PostgreSQL 持久化 Node API,无需借助 Sequelize 之类的 ORM。dev.to 上的 Node API 教程代码库 AwesomeNodePostgres

2025-06-10

使用 PostgreSQL 持久化 Node API,无需借助 sequelize 等 ORM。

dev.to 上的 Node API 教程代码库

AwesomeNodePostgres

当我们使用“持久化”这个词时,我们指的是什么?在日常英语中,持久化是指“在原因消除后,结果仍然能够持续存在”。在数据库中存储数据的语境中,持久化是指记录在创建过程结束后仍然能够保留的能力。

与其他使用 MongoDB 实现数据持久化的 NodeJS 教程不同,我们将使用 PostgreSQL。此外,为了确保掌握使用 NodeJS 和 PostgreSQL 开发 Restful API 的基础知识,我们将避免使用 ORM(对象关系映射),更多信息请阅读👉此处

先决条件

  1. 学习我的使用 Express 和 Es6 编写基本 NodeJs API 的课程,您可以在下面找到它👇
  2. 掌握 SQL 查询语法的基础知识,因为本教程不会涵盖这些
  3. NodeJs 和 Express 的基础知识
  4. 已安装 NodeJs,这里是下载链接
  5. 已安装 PostgreSQL,这里是下载链接
  6. 安装后搜索应用程序pgAdmin并启动它,随 PostgreSQL 一起安装。pgAdmin 是 PostgreSQL 的 GUI 管理和开发平台(这意味着它有助于使我们的数据库管理更加轻松和友好)

入门:
在本教程中,我们将为类注册表创建一个 API,我们将开始创建和设置我们的数据库。

按照以下说明使用 pgAdmin 创建数据库:
1. Double click on the PostgreSQL server

2. Right-lick on Login Roles, assuming you have none and select new login role

3. Type your preferred Role name, mine is school_reg

4. Move to the next tab *Definition* and set your password for this role, mine is school_reg

5. Click on *OK* to save

6. Right-click on Databases and select New Database

7. Type Database name in the space for Name, mine is school_register

8. Select owner of Database, here we would select the login role or user we created, remember mine is school_reg

9. Click *OK* to save

上图说明了上述过程,放大可以看得更清楚:

数据库创建示意图

创建数据库后,我们需要创建表和表关系,用更通俗的术语来说,就是创建模式。目前我们只有一张表,也就是我们自己的student表,里面保存着学生的基本信息。随着应用程序的扩展,如果我们选择扩展,就需要创建更多表。

项目设置:

  1. 我们将首先创建我们的项目文件夹,我将我的文件夹命名为AwesomeNodepostgres,是的,我知道这很长,您可以自由选择一个更短的名称。

  2. npm init在命令行中找到项目文件夹后,运行以下命令将项目初始化为 Node 项目。如果您还没有这样做,请参阅上一篇教程来了解如何操作。

完成上述步骤后,您的项目目录应该如下所示,假设您正在使用我最喜欢的代码编辑器vscode。
vscode 截图

现在一切都搞定了,我们先来安装一些编写应用程序所需的软件包。本教程需要以下 Node 软件包:

  1. Express,我们在上一篇文章中已经遇到过
  2. 为了与我们的 postgres 数据库通信,我们需要一个名为node-postgres的包。
  3. 为了确保我们的服务器始终监听更改并重新启动我们的应用程序,我们还需要安装另一个包nodemon

要安装前两个包,请确保您在命令行中处于项目文件夹内。然后运行以下命令:

            npm install express pg --save
            npm install nodemon --save-dev
Enter fullscreen mode Exit fullscreen mode

--save-dev这里的意思是保存并仅在开发期间使用 nodemon 作为开发依赖项,因此在生产期间不会使用 nodemon。

现在要建立数据库连接,我们需要创建一个文件夹services,并在该文件夹内创建一个名为的文件db.js
因此services/db.js,在里面输入以下代码;

const pg = require('pg');

const config = {
  user: 'school_reg', //this is the db user credential
  database: 'school_register',
  password: 'school_reg',
  port: 5432,
  max: 10, // max number of clients in the pool
  idleTimeoutMillis: 30000,
};

const pool = new pg.Pool(config);

pool.on('connect', () => {
  console.log('connected to the Database');
});
Enter fullscreen mode Exit fullscreen mode

现在要创建我们的表格,请在上一个代码块下键入以下代码;

const createTables = () => {
  const schoolTable = `CREATE TABLE IF NOT EXISTS
      students(
        id SERIAL PRIMARY KEY,
        student_name VARCHAR(128) NOT NULL,
        student_age INT NOT NULL,
        student_class VARCHAR(128) NOT NULL,
        parent_contact VARCHAR(128) NOT NULL,
        admission_date VARCHAR(128) NOT NULL
      )`;
  pool.query(schoolTable)
    .then((res) => {
      console.log(res);
      pool.end();
    })
    .catch((err) => {
      console.log(err);
      pool.end();
    });
};
Enter fullscreen mode Exit fullscreen mode

要使用此脚本创建我们的表,我们需要找到一种在命令行上运行此代码的方法。我们可以使用另一个名为的包make-runnable,安装该包;npm install make-runnable --save,安装后,返回页面底部的代码库,添加以下内容;

pool.on('remove', () => {
  console.log('client removed');
  process.exit(0);
});


//export pool and createTables to be accessible  from an where within the application
module.exports = {
  createTables,
  pool,
};

require('make-runnable');
Enter fullscreen mode Exit fullscreen mode

现在,为了创建我们的应用,让我们在package.json文件上编写一个脚本,当从命令行运行时,它会为我们创建一个表。在package.json文件中找到对象脚本,将对象内部的内容替换为以下代码:

"create": "node ./services/db createTables"
Enter fullscreen mode Exit fullscreen mode

在项目目录中转到命令行并运行;

npm run create
Enter fullscreen mode Exit fullscreen mode

下图显示了执行此操作时发生的情况,并仔细查看在 pgAdmin 应用程序上定位新创建的表的位置。

运行 npm run create

查看新创建的表

随着数据库和表的创建完成,我们就可以开始在数据库中存储数据并检索存储的数据了。

在此之前,让我们先创建index.js文件,其中包含我们的服务器和快速代码,在项目文件夹中创建一个名为的文件index.js。在我们的文件中输入以下代码index.js

   const express = require('express');
   const app = express();


   const port = process.env.PORT || 3000;


   // Add route code Here
   app.get('/', (req, res) => {
      res.send('Welcome to Our SCHOOL API');
   });


   app.listen(port, () => {
      console.log(`We are live at 127.0.0.1:${port}`);
   });
Enter fullscreen mode Exit fullscreen mode

scripts要运行我们的应用程序,让我们在文件中找到的对象上添加两个额外的代码package.json,在创建之前,删除这两个;

    "dev": "nodemon index.js",
    "start": "node index.js",
Enter fullscreen mode Exit fullscreen mode

运行脚本

现在运行我们的项目,我们将使用 nodemon 选项,这样无论我们做了什么更改,我们都能注意到。尝试观察当你进行更改并保存时,nodemon 是如何重启服务器的。

nodemon 启动服务器

服务器启动后,访问服务器监听的链接(127.0.0.1:3000我的链接已指定)。打开 Postman 应用程序,并使用该链接发出 GET 请求。

邮差

现在,让我们创建处理创建学生信息和获取所有学生信息的路由。在index.js文件的第一个路由之后,添加以下代码,这些代码将分别处理插入学生信息和获取所有学生信息的操作。为了能够将数据插入数据库,我们需要能够选择任何请求主体中提供的值,为此,我们将使用名为body-parser的 Node 包。

npm install body-parser
Enter fullscreen mode Exit fullscreen mode

安装上述软件包后,index.js在继续我们的路线之前,将以下代码添加到我们的代码中。在下面添加以下内容const app = express();

const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyparser.urlencoded({extended:true}));
Enter fullscreen mode Exit fullscreen mode

现在让我们继续我们的路线;

app.get('/student', (req, res) => {
pool.connect((err, client, done) => {
    const query = 'SELECT * FROM students';
    client.query(query, (error, result) => {
      done();
      if (error) {
        res.status(400).json({error})
      } 
      if(result.rows < '1') {
        res.status(404).send({
        status: 'Failed',
        message: 'No student information found',
        });
      } else {
        res.status(200).send({
        status: 'Successful',
        message: 'Students Information retrieved',
        students: result.rows,
        });
      }
    });
  });
});


app.post('/student', (req, res) => {
  const data = {
    name : req.body.studentName,
    age : req.body.studentAge,
    classroom : req.body.studentClass,
    parents : req.body.parentContact,
    admission : req.body.admissionDate,
  }

  pool.connect((err, client, done) => {
    const query = 'INSERT INTO students(student_name,student_age, student_class, parent_contact, admission_date) VALUES($1,$2,$3,$4,$5) RETURNING *';
    const values = [data.name, data.age, data.classroom, data.parents, data.admission];

    client.query(query, values, (error, result) => {
      done();
      if (error) {
        res.status(400).json({error});
      }
      res.status(202).send({
        status: 'SUccessful',
        result: result.rows[0],
      });
    });
  });
});
Enter fullscreen mode Exit fullscreen mode

运行你的应用,然后访问 Postman 上的链接,这次127.0.0.1/student对每个请求交替使用 GET 和 POST 两种方式。如果你不知道如何使用 Postman 进行测试,请查看下面的截图并执行完全相同的操作。

  1. 首先,在邮递员上设置标题信息:
    标头信息

  2. 之后,我们将设置主体值,按照下面的截图操作:
    身体配置

  3. 然后点击“发送”,你就得到了结果
    结果

现在运行获取请求,将请求类型更改为 GET,然后单击发送。

得到

Wolla!!! 现在我们的 API 已经可以获取数据并发送到数据库了。

注意:将我们的路由、服务器和快速应用程序放在一个文件中是不好的做法,请在 GitHub 上为该项目存储库加注星标,分叉并提交 PR,以学习如何操作,因为我会继续进行该操作,或者您可以尝试自己进行操作并提交推送请求。

让我们为我们的应用程序添加一条路线,假设我们想要获取特定学生的信息,我们会编写路线,但我希望您根据所学内容编写查询并返回响应。

app.get('/student/:id', (req,res) => {
  const id = req.params.id;
  res.send(`Student ${id} profile`);
});
Enter fullscreen mode Exit fullscreen mode

当我们向新的端点发出请求时,我们会得到;

个别学生

因此,请尝试完成代码以从数据库中选择您所引用其 ID 的学生。

以下是承诺的 GitHub Repo,请不要忘记点赞。谢谢。

在下一个教程中,我们将研究如何验证我们的路线,因此如果没有适当的身份验证,用户就无法访问路线。

GitHub 徽标 ogwurujohnson / AwesomeNodePostgres

该项目旨在教授如何使用 PostgreSQL 持久化数据,同时使用 NodeJs 创建 API

节点E express P postgres
 

dev.to 上的 Node API 教程代码库

将记录存储在数据库中

从数据库检索记录

更新数据库中的记录等


图像

项目

GitHub 问题 GitHub 分叉 GitHub 星标 GitHub 许可证 价格

叽叽喳喳

AwesomeNodePostgres

该项目旨在教授如何使用 PostgreSQL 持久化数据,同时使用 NodeJs 创建 API。我们将致力于创建一个课堂应用程序,该 API 目前用于处理查看所有学生、添加学生、编辑学生详细信息、删除学生等功能。欢迎您为该项目做出贡献,并在 README.md 文件中留下如何使用它的说明,从而添加其他功能。




链接:https://dev.to/ogwurujohnson/-persisting-a-node-api-with-postgresql-without-the-help-of-orms-like-sequelize-5dc5
PREV
模块联合、React 和 Typescript 微前端简介
NEXT
为你的 PowerShell 添加类似 Bash 的自动完成功能 在你的 PowerShell 中启用更好的自动完成功能 额外功能:将 MacOS 中的打开命令添加到你的 PowerShell 最后一条提示:使用新的 Windows 终端