发布于 2025-12-10 1 阅读
0

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

使用 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