如何在 Ubuntu 20.04 上使用 PostgreSQL 和 Node.js

作者选择了 女性工程师协会作为 写给捐赠计划的一部分获得捐赠。

介绍

Node.js生态系统提供了与数据库接口的一组工具。其中一个工具是 node-postgres,其中包含允许 Node.js 与 PostgreSQL 数据库接口的模块。使用node-postgres,您将能够编写能够访问和存储在 PostgreSQL 数据库中的 Node.js 程序。

在本教程中,您将使用node-postgres连接和查询 PostgreSQL 数据库. 首先,您将在 Postgres 中创建一个数据库用户和数据库. 然后使用node-postgres模块将您的应用程序连接到 Postgres 数据库. 之后,您将使用node-postgres在 PostgreSQL 数据库中插入、检索和修改数据。

前提条件

要完成本教程,您将需要:

在Ubuntu 20.04上启用了sudo特权和防火墙的非根用户帐户,请遵循我们的教程(Initial Server Setup with Ubuntu 20.04)(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04)来设置您的服务器。

步骤 1 - 设置项目目录

在此步骤中,您将创建节点应用程序的目录并使用npm安装node-postgres

使用mkdir命令创建您的项目目录:

1mkdir node_pg_app

使用cd命令导航到新创建的目录:

1cd node_pg_app

使用npm init命令以package.json文件初始化目录:

1npm init -y

「-y」旗创建了默认的「package.json」文件。

接下来,安装npm installnode-postgres模块:

1npm install pg

您现在已经为您的项目设置了目录,并安装了node-postgres作为依赖,您现在准备在 Postgres 中创建用户和数据库。

步骤 2 — 在 PostgreSQL 中创建数据库用户和数据库

在此步骤中,您将创建一个数据库用户和应用程序的数据库。

当你第一次在Ubuntu上安装Postgres时,它会在你的系统上创建一个用户postgres,一个名为postgres的数据库用户和一个数据库postgres

PostgreSQL 使用 ident authentication 连接方案,允许 Ubuntu 上的用户登录 Postgres 壳,只要用户名与 Postgres 用户相似。

要登录,将 Ubuntu 用户切换为postgressudo并使用psql命令登录到 Postgres 壳:

1sudo -u postgres psql

指挥官的论点代表:

  • -u:一个旗帜,将用户切换为在Ubuntu上的特定用户。通过postgres用户作为一个论点,将Ubuntu上的用户切换为postgres
  • `psql’:一个Postgres交互式终端程序,你可以输入SQL命令来创建数据库,角色,表和更多。

一旦您登录到 Postgres 壳,您的终端将看起来如下:

postgres是您正在互动的数据库的名称,而#表示您已登录为超级用户。

对于 Node 应用程序,您将创建一个单独的用户和数据库,该应用程序将用于连接到 Postgres。

要做到这一点,创建一个新的角色,有一个强大的密码:

1CREATE USER fish_user WITH PASSWORD 'password';

Postgres中的角色可以视为用户或组,取决于您的使用案例. 在本教程中,您将使用它作为用户。

接下来,创建数据库,并将所有权分配给您创建的用户:

1CREATE DATABASE fish OWNER fish_user;

将数据库所有权分配给fish_user将赋予创建、放下和插入数据到fish数据库中的表的角色权限。

创建用户和数据库后,退出 Postgres 交互壳:

1\q

要作为fish_user登录 Postgres 壳,您需要在 Ubuntu 上创建一个与您创建的 Postgres 用户相似的用户名。

使用adduser命令创建用户:

1sudo adduser fish_user

现在你已经在Ubuntu上创建了一个用户,一个PostgreSQL用户,并为你的Node应用程序创建了一个数据库,接下来,你将使用fish_user登录到PostgreSQL交互壳并创建一个表。

步骤 3 – 打开一个 Postgres 壳与一个角色和创建一个表

在本节中,你将打开Postgres壳与你在Ubuntu上前一节创建的用户一起。

若要作为fish_user打开壳,请输入以下命令:

1sudo -u fish_user psql -d fish

「sudo -u fish_user」會將您的 Ubuntu 使用者轉換為「fish_user」,然後作為該使用者執行「psql」命令。「-d」旗指明您要連接的資料庫,在這種情況下是「fish」。

一旦您登录到psql壳,您的壳提示将看起来如下:

fish表示您现在已连接到fish数据库。

您可以使用\conninfo 命令来验证连接:

1\conninfo

您将收到类似于以下的输出:

1[secondary_label Output]
2You are connected to database "fish" as user "fish_user" via socket in "/var/run/postgresql" at port "5432".

输出确认您确实已登录为fish_user,并且已连接到fish数据库。

接下来,您将创建一个表,其中包含您的应用程序将插入的数据。

您将创建的表将跟踪鲨鱼名称及其颜色,当数据填充时,它将看起来如下:

idnamecolor
1sammyblue
2joseteal

使用 SQL 命令创建表,创建表:

1CREATE TABLE shark(
2id SERIAL PRIMARY KEY,
3name VARCHAR(50) NOT NULL,
4color VARCHAR(50) NOT NULL);

CREATE TABLE shark命令将创建一个包含3个列的表:

  • id:一个自动增加字段和表的主要密钥. 每次插入一行,Postgres 都会增加并填充 id 值。
  • 名称颜色:可以存储 50 个字符的字段。

检查表是否与正确的所有者创建:

1\dt

\dt命令列出数据库中的所有表。

当您运行命令时,输出将如下:

1List of relations
2 Schema | Name  | Type  |   Owner
3--------+-------+-------+-----------
4 public | shark | table | fish_user
5(1 row)

输出确认fish_user拥有shark表。

现在走出 Postgres 壳:

1\q

它会把你带回项目目录。

创建表后,您将使用node-postgres模块连接到 Postgres。

步骤 4 – 连接到 Postgres 数据库

在此步骤中,您将使用node-postgres连接您的 Node.js 应用程序到 PostgreSQL 数据库。 要做到这一点,您将使用node-postgres创建一个 connection pool。 连接池作为数据库连接的缓存功能,允许您的应用程序为所有数据库请求重复使用连接。

在您喜爱的编辑器中创建并打开db.js文件. 在本教程中,您将使用nano,一个终端文本编辑器:

1nano db.js

在你的「db.js」文件中,请在「node-postgres」模块中要求并使用 destructuring assignment从「node-postgres」中提取一类「Pool」。

1[label node_pg_app/db.js]
2const { Pool } = require('pg')

接下来,创建一个实例来创建一个连接池:

 1[label node_pg_app/db.js]
 2const { Pool} = require('pg')
 3
 4const pool = new Pool({
 5  user: 'fish_user',
 6  database: 'fish',
 7  password: 'password',
 8  port: 5432,
 9  host: 'localhost',
10})

当您创建Pool实例时,您将一个配置对象作为一个参数传递,该对象包含node-postgres将使用的详细信息来建立与 Postgres 的连接。

对象定义了以下属性:

  • 用户:您在 Postgres 中创建的用户.
  • 数据库:您在 Postgres 中创建的数据库的名称.
  • password: 用户 fish_user 的密码.
  • port: Postgres 端口正在收听. 5432 是默认端口.
  • host:您希望 node-postgres 连接到的 Postgres 服务器。

<$>[注] 注: 在生产中,建议将配置值保存在另一个文件中,如.env 文件,然后将此文件添加到.gitignore 文件中,如果使用 Git,以避免使用版本控制来跟踪它。

创建实例后,建立了数据库连接,并将对象存储在变量中。要在应用程序中的任何地方使用此变量,您需要导出它。

 1[label node_pg_app/db.js]
 2const { Pool } = require("pg");
 3
 4const pool = new Pool({
 5  user: "fish_user",
 6  database: "fish",
 7  password: "password",
 8  port: 5432,
 9  host: "localhost",
10});
11
12module.exports = { pool };

保存文件并按CTRL+X来退出nano。输入y来保存更改,并通过在 Mac 上按ENTERRETURN键确认您的文件名。

现在您已将应用程序连接到 Postgres,您将使用此连接在 Postgres 中插入数据。

步骤 5 – 将数据插入 Postgres 数据库

在此步骤中,您将创建一个将数据添加到 PostgreSQL 数据库的程序,使用您在 db.js 文件中创建的连接池. 为了确保该程序每次运行时输入不同的数据,您将为其提供接受命令行参数的功能。

在您的编辑器中创建并打开 insertData.js 文件:

1nano insertData.js

insertData.js文件中,添加以下代码,使脚本过程成为命令行参数:

1[label node_pg_app/insertData.js]
2const { pool } = require("./db");
3
4async function insertData() {
5  const [name, color] = process.argv.slice(2);
6  console.log(name, color);
7}
8
9insertData();

首先,您需要从db.js文件中进入对象,这允许您的程序使用数据库连接查询数据库。

接下来,您将insertData()函数声明为与async关键字非同步函数,从而允许您使用Wait关键字使数据库请求非同步。

insertData()函数中,您可以使用进程模块访问 命令行参数。Node.jsprocess.argv方法返回一个数组中的所有参数,包括节点insertData.js参数。

例如,当您在终端上使用node insertData.js sammy blue运行脚本时,process.argv方法将返回一个数组:[node,insertData.js,sammy,blue](数组已被编辑为简短)。

要跳过前两个元素: nodeinsertData.js,您将 JavaScript 的 slice() 方法附加到 process.argv 方法,此方法将元素从索引 2 返回,然后将这些参数摧毁为 namecolor 变量。

保存您的文件,然后输出nanoCTRL+X。使用node运行该文件,并将参数sammyblue传递给它:

1node insertData.js sammy blue

运行命令后,您将看到以下输出:

1[secondary_label Output]
2sammy blue

该函数现在可以从命令行参数中访问名称和鲨鱼颜色

在文本编辑器中再次打开insertData.js文件,并添加突出的代码:

 1[label node_pg_app/insertData.js]
 2const { pool } = require("./db");
 3
 4async function insertData() {
 5  const [name, color] = process.argv.slice(2);
 6  const res = await pool.query(
 7      "INSERT INTO shark (name, color) VALUES ($1, $2)",
 8      [name, color]
 9    );
10  console.log(`Added a shark with the name ${name}`);
11}
12
13insertData();

现在,insertData()函数定义了鲨鱼的名称颜色。接下来,它将从node-postgres等待pool.query方法,该函数将 SQL 语句INSERT INTO shark (名称,颜色)...作为第一个论点。 SQL 语句将记录插入鲨鱼表中。它使用所谓的 parameterized query。 $1,而$2则与在pool.query()方法中提供的数组中的名称颜色变量相匹配,作为第二个论点:[名称,颜色]`。当 Postgres 执行语句时,变量被替换,安全地保护您的应用程序免受 [SQL injection](L

在运行脚本之前,将insertData()函数内的代码包装到一个 try...catch块中,以处理运行时错误:

 1[label node_pg_app/insertData.js]
 2const { pool } = require("./db");
 3
 4async function insertData() {
 5  const [name, color] = process.argv.slice(2);
 6  try {
 7    const res = await pool.query(
 8      "INSERT INTO shark (name, color) VALUES ($1, $2)",
 9      [name, color]
10    );
11    console.log(`Added a shark with the name ${name}`);
12  } catch (error) {
13    console.error(error)
14  }
15}
16
17insertData()

当该函数运行时,块内的代码会执行.如果成功,该函数将跳过捕捉块并退出.但是,如果在块内引发错误,则捕捉块将在控制台中执行并记录错误。

您的程序现在可以采取命令行参数,并使用它们将记录插入到鲨鱼表中。

保存并退出文本编辑器. 运行insertData.js文件以sammyblue作为命令行参数:

1node insertData.js sammy blue

您将收到以下输出:

1[secondary_label Output]
2Added a shark with the name sammy

运行命令插件是鲨鱼表中的一个记录,名称为sammy和颜色为蓝色

接下来,用joseteal作为命令行参数再次执行文件:

1node insertData.js jose teal

您的输出将看起来如下:

1[secondary_label Output]
2Added a shark with the name jose

这确认您在鲨鱼表中插入了另一个记录,名称为jose和颜色为teal

您现在已经在鲨鱼表中插入了两个记录,在下一个步骤中,您将从数据库中获取数据。

第6步:从Postgres数据库中获取数据

在此步骤中,您将使用node-postgres获取鲨鱼表中的所有记录,并将其登录到控制台。

在您最喜爱的编辑器中创建并打开retrieveData.js文件:

1nano retrieveData.js

retrieveData.js中,添加以下代码来从数据库中获取数据:

 1[label node_pg_app/retrieveData.js]
 2const { pool } = require("./db");
 3
 4async function retrieveData() {
 5  try {
 6    const res = await pool.query("SELECT * FROM shark");
 7    console.log(res.rows);
 8  } catch (error) {
 9    console.error(error);
10  }
11}
12
13retrieveData()

retrieveData()函数读取鲨鱼表中的所有行,并在控制台中登录它们。在试试函数块中,您从node-postgres中调用pool.query()方法,以 SQL 语句作为参数。 SQL 语句SELECT * FROM shark检索鲨鱼表中的所有记录。一旦它们被检索,则console.log()语句会登录行。

如果引发错误,执行将跳过到捕获块,并记录错误. 在最后一行中,您呼吁retrieveData()函数。

接下来,保存并关闭编辑器,运行retrieveData.js文件:

1node retrieveData.js

您将看到类似于此的输出:

1[secondary_label Output]
2[
3  { id: 1, name: 'sammy', color: 'blue' },
4  { id: 2, name: 'jose', color: 'teal' }
5]

node-postgres 返回 JSON 类似对象中的表行. 这些对象存储在一个数组中。

您现在可以从数据库中获取数据,您将使用node-postgres修改表中的数据。

步骤 7 – 在 Postgres 数据库中修改数据

在此步骤中,您将使用node-postgres来修改 Postgres 数据库中的数据,这将允许您更改任何鲨鱼表记录中的数据。

您将创建一个使用两个命令行参数的脚本: idname. 您将使用 id 值在表中选择所需的记录。

创建并打开modifyData.js文件:

1nano modifyData.js

modifyData.js文件中,添加以下代码来修改鲨鱼表中的记录:

 1[label node_pg_app/modifyingData.js]
 2const { pool } = require("./db");
 3
 4async function modifyData() {
 5  const [id, name] = process.argv.slice(2);
 6  try {
 7    const res = await pool.query("UPDATE shark SET name = $1 WHERE id = $2", [
 8      name,
 9      id,
10    ]);
11    console.log(`Updated the shark name to ${name}`);
12  } catch (error) {
13    console.error(error);
14  }
15}
16
17modifyData();

首先,您需要在您的modifyData.js文件中的db.js文件中的对象。

接下来,您将定义一个非同步函数 modifyData() 来修改 Postgres 中的记录. 在函数中,您将使用破坏分配的命令行参数中定义两个变量 id 和 `name 。

试用块中,您将从node-postgres中调用pool.query方法,将 SQL 语句作为第一个参数。在更新 SQL 语句中,WHERE语句会选择匹配id值的记录。

接下來,「console.log」會登錄執行記錄名稱變更後的訊息. 最後,您會在最後一行中呼叫「modifyData()」函數。

使用CTRL+X保存并退出文件。运行modifyData.js文件以2san作为参数:

1node modifyData.js 2 san

您将获得以下输出:

1[secondary_label Output]
2Updated the shark name to san

若要确认记录名称已从jose更改为san,请运行retrieveData.js文件:

1node retrieveData.js

您将获得类似于以下的输出:

1[secondary_label Output]
2output
3[
4  { id: 1, name: 'sammy', color: 'blue' },
5  { id: 2, name: 'san', color: 'teal' }
6]

你现在应该看到,ID2的唱片现在有新的名称san取代jose

完成此操作后,您现在已经成功地使用node-postgres更新了数据库中的记录。

结论

在本教程中,您使用node-postgres连接和查询 Postgres 数据库. 您开始在 Postgres 中创建用户和数据库. 然后创建表,使用node-postgres连接您的应用程序到 Postgres,并使用node-postgres模块在 Postgres 中插入、检索和修改数据。

若要了解更多關於「node-postgres」的資訊,請瀏覽他們的 文檔。 為了提高您的 Node.js 技能,您可以探索 如何在 Node.js 系列中編碼

Published At
Categories with 技术
comments powered by Disqus