作者选择了 女性工程师协会作为 写给捐赠计划的一部分获得捐赠。
介绍
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)来设置您的服务器。
- Node.js 安装在Ubuntu 上。 如果您没有安装了 Node.js,请遵循 How To Install Node.js on Ubuntu 20.04)。 PostgreSQL 安装在您的服务器上。 遵循指南(How To Install and Use PostgreSQL on Ubuntu 20.04)(https://andsky.com/tech/tutorials/how-to-install-and-use-postgresql-on-ubuntu-20-04)来安装 PostgreSQL 在Ubuntu 上。
- 关于如何在Ubuntu上编写查询的基本知识,请参阅 [An Introduction to Queries in
步骤 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 install的node-postgres模块:
1npm install pg
您现在已经为您的项目设置了目录,并安装了node-postgres作为依赖,您现在准备在 Postgres 中创建用户和数据库。
步骤 2 — 在 PostgreSQL 中创建数据库用户和数据库
在此步骤中,您将创建一个数据库用户和应用程序的数据库。
当你第一次在Ubuntu上安装Postgres时,它会在你的系统上创建一个用户postgres,一个名为postgres的数据库用户和一个数据库postgres。
PostgreSQL 使用 ident authentication 连接方案,允许 Ubuntu 上的用户登录 Postgres 壳,只要用户名与 Postgres 用户相似。
要登录,将 Ubuntu 用户切换为postgres以sudo并使用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数据库。
接下来,您将创建一个表,其中包含您的应用程序将插入的数据。
您将创建的表将跟踪鲨鱼名称及其颜色,当数据填充时,它将看起来如下:
| id | name | color |
|---|---|---|
| 1 | sammy | blue |
| 2 | jose | teal |
使用 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 上按ENTER或RETURN键确认您的文件名。
现在您已将应用程序连接到 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](数组已被编辑为简短)。
要跳过前两个元素: node 和 insertData.js,您将 JavaScript 的 slice() 方法附加到 process.argv 方法,此方法将元素从索引 2 返回,然后将这些参数摧毁为 name 和 color 变量。
保存您的文件,然后输出nano以CTRL+X。使用node运行该文件,并将参数sammy和blue传递给它:
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文件以sammy和blue作为命令行参数:
1node insertData.js sammy blue
您将收到以下输出:
1[secondary_label Output]
2Added a shark with the name sammy
运行命令插件是鲨鱼表中的一个记录,名称为sammy和颜色为蓝色。
接下来,用jose和teal作为命令行参数再次执行文件:
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 数据库中的数据,这将允许您更改任何鲨鱼表记录中的数据。
您将创建一个使用两个命令行参数的脚本: id 和 name. 您将使用 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文件以2和san作为参数:
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 系列中編碼 。