作者选择了 女性工程师协会作为 写给捐赠计划的一部分获得捐赠。
介绍
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 系列中編碼 。