著者は、 Society of Women Engineers を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

Node.js エコシステムは、データベースとのインターフェースのための一連のツールを提供します。 それらのツールの1つは、 node-postgres です。これには、Node.jsがPostgreSQLデータベースとインターフェイスできるようにするモジュールが含まれています。 使用する node-postgres、PostgreSQLデータベースのデータにアクセスして保存できるNode.jsプログラムを作成できるようになります。

このチュートリアルでは、 node-postgres PostgreSQL(略してPostgres)データベースに接続してクエリを実行します。 まず、Postgresでデータベースユーザーとデータベースを作成します。 次に、を使用してアプリケーションをPostgresデータベースに接続します。 node-postgres モジュール。 その後、使用します node-postgres PostgreSQLデータベースのデータを挿入、取得、および変更します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • root以外のユーザーアカウント sudo Ubuntu20.04で有効になっている特権とファイアウォール。 チュートリアルUbuntu20.04 を使用したサーバーの初期セットアップに従って、サーバーをセットアップします。

  • UbuntuにインストールされたNode.js。 Node.jsをインストールしていない場合は、 Ubuntu20.04にNode.jsをインストールする方法に従ってください。

  • サーバーにPostgreSQLがインストールされています。 ガイドUbuntu20.04にPostgreSQLをインストールして使用する方法に従って、UbuntuにPostgreSQLをインストールします。

  • PostgreSQLでクエリを作成する方法の基本的な知識。詳細については、PostgreSQLでのクエリの概要を参照してください。

  • Node.jsプログラムの作成方法の基本については、Node.jsで最初のプログラムを作成して実行する方法を参照してください。

  • JavaScriptで非同期関数を作成する方法の基本的な理解。 基本を学ぶために、 JavaScript チュートリアルでのイベントループ、コールバック、プロミス、および非同期/待機について理解してください。

ステップ1-プロジェクトディレクトリの設定

このステップでは、ノードアプリケーションのディレクトリを作成してインストールします node-postgres を使用して npm. このディレクトリは、相互作用するPostgreSQLデータベースと構成ファイルの構築に取り組む場所です。

を使用してプロジェクトのディレクトリを作成します mkdir 指図:

  1. mkdir node_pg_app

を使用して、新しく作成されたディレクトリに移動します cd 指図:

  1. cd node_pg_app

ディレクトリを初期化する package.json を使用してファイル npm init 指図:

  1. npm init -y

The -y フラグはデフォルトを作成します package.json ファイル。

次に、 node-postgres モジュール付き npm install:

  1. npm install pg

これで、プロジェクトのディレクトリが設定され、インストールされました node-postgres 依存関係として。 これで、Postgresでユーザーとデータベースを作成する準備が整いました。

ステップ2—PostgreSQLでデータベースユーザーとデータベースを作成する

このステップでは、アプリケーションのデータベースユーザーとデータベースを作成します。

初めてUbuntuにPostgresをインストールすると、ユーザーが作成されます postgres システムでは、 postgres、およびデータベース postgres. ユーザー postgres ユーザーやデータベースの作成などの管理タスクを実行できるPostgreSQLセッションを開くことができます。

PostgreSQLはidentauthentication 接続スキームを使用します。これにより、Ubuntuのユーザーは、ユーザー名がPostgresユーザーと類似している限り、Postgresシェルにログインできます。 あなたはすでに持っているので postgres Ubuntuのユーザーと postgres あなたに代わって作成されたPostgreSQLのユーザーは、Postgresシェルにログインできます。

ログインするには、Ubuntuユーザーをに切り替えます postgressudo を使用してPostgresシェルにログインします psql 指図:

  1. sudo -u postgres psql

コマンドの引数は次のことを表します。

  • -u:Ubuntuでユーザーを特定のユーザーに切り替えるフラグ。 通過 postgres 引数としてのuserは、Ubuntuのユーザーをに切り替えます postgres.
  • psql:SQLコマンドを入力してデータベース、ロール、テーブルなどを作成できるPostgresインタラクティブターミナルプログラム。

Postgresシェルにログインすると、ターミナルは次のようになります。

postgres 対話するデータベースの名前であり、 # スーパーユーザーとしてログインしていることを示します。

Nodeアプリケーションの場合、アプリケーションがPostgresへの接続に使用する個別のユーザーとデータベースを作成します。

これを行うには、強力なパスワードを使用して新しい役割を作成します。

  1. CREATE USER fish_user WITH PASSWORD 'password';

Postgresでの役割は、ユースケースに応じてユーザーまたはグループと見なすことができます。 このチュートリアルでは、ユーザーとして使用します。

次に、データベースを作成し、作成したユーザーに所有権を割り当てます。

  1. CREATE DATABASE fish OWNER fish_user;

データベースの所有権をに割り当てる fish_user データを作成、ドロップ、およびテーブルに挿入するためのロール権限を付与します。 fish データベース。

ユーザーとデータベースを作成したら、Postgresインタラクティブシェルを終了します。

  1. \q

Postgresシェルにログインするには fish_user、作成したPostgresユーザーと同様の名前でUbuntuにユーザーを作成する必要があります。

でユーザーを作成します adduser 指図:

  1. sudo adduser fish_user

これで、Ubuntuでユーザー、PostgreSQLユーザー、およびNodeアプリケーション用のデータベースが作成されました。 次に、を使用してPostgreSQLインタラクティブシェルにログインします。 fish_user テーブルを作成します。

ステップ3—ロールを使用してPostgresシェルを開き、テーブルを作成する

このセクションでは、Ubuntuで前のセクションで作成したユーザーでPostgresシェルを開きます。 シェルにログインしたら、Node.jsアプリのテーブルを作成します。

としてシェルを開くには fish_user、次のコマンドを入力します。

  1. sudo -u fish_user psql -d fish

sudo -u fish_user Ubuntuユーザーをに切り替えます fish_user その後、を実行します psql そのユーザーとしてのコマンド。 The -d フラグは、接続するデータベースを指定します。 fish この場合。 データベースを指定しない場合は、 psql 接続しようとします fish_user デフォルトではデータベース。これは検出されず、エラーがスローされます。

ログインしたら psql シェルの場合、シェルプロンプトは次のようになります。

fish に接続していることを示します fish データベース。

を使用して接続を確認できます \conninfo 指図:

  1. \conninfo

次のような出力が表示されます。

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

出力は、あなたが実際にとしてログインしたことを確認します fish_user そして、あなたはに接続しています fish データベース。

次に、アプリケーションが挿入するデータを含むテーブルを作成します。

作成するテーブルは、サメの名前とその色を追跡します。 データを入力すると、次のようになります。

id 名前
1 サミー
2 ホセ ティール

SQLの使用 create table コマンド、テーブルを作成します:

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

The CREATE TABLE shark コマンドは、3列のテーブルを作成します。

  • id:テーブルの自動インクリメントフィールドと主キー。 行を挿入するたびに、Postgresはインクリメントしてデータを入力します id 価値。

  • namecolor:50文字を格納できるフィールド。 NOT NULL フィールドが空になるのを防ぐ制約です。

テーブルが適切な所有者で作成されているかどうかを確認します。

  1. \dt

The \dt コマンドは、データベース内のすべてのテーブルを一覧表示します。

コマンドを実行すると、出力は次のようになります。

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

出力は、 fish_user を所有している shark テーブル。

次に、Postgresシェルを終了します。

  1. \q

プロジェクトディレクトリに戻ります。

テーブルを作成したら、 node-postgres Postgresに接続するモジュール。

ステップ4—Postgresデータベースに接続する

このステップでは、 node-postgres Node.jsアプリケーションをPostgreSQLデータベースに接続します。 そのためには、 node-postgres 接続プールを作成します。 接続プールはデータベース接続のキャッシュとして機能し、アプリがすべてのデータベース要求に接続を再利用できるようにします。 これにより、アプリケーションを高速化し、サーバーリソースを節約できます。

を作成して開きます db.js お好みのエディタでファイルします。 このチュートリアルでは、 nano、ターミナルテキストエディタ:

  1. nano db.js

あなたの中で db.js ファイル、で必要 node-postgres モジュールを作成し、destructuringassignmentを使用してクラスを抽出します Pool から node-postgres.

node_pg_app / db.js
const { Pool } = require('pg')

次に、 Pool 接続プールを作成するインスタンス:

node_pg_app / db.js
const { Pool} = require('pg')

const pool = new Pool({
  user: 'fish_user',
  database: 'fish',
  password: 'password',
  port: 5432,
  host: 'localhost',
})

作成するとき Pool たとえば、構成オブジェクトを引数として渡します。 このオブジェクトには詳細が含まれています node-postgres Postgresへの接続を確立するために使用します。

オブジェクトは、次のプロパティを定義します。

  • user:Postgresで作成したユーザー。
  • database:Postgresで作成したデータベースの名前。
  • password:ユーザーのパスワード fish_user.
  • port:Postgresがリッスンしているポート。 5432 デフォルトのポートです。
  • host:必要なPostgresサーバー node-postgres 接続する。 それを渡す localhost 接続します node-postgres システムにインストールされているPostgresサーバーに接続します。 Postgresサーバーが別のドロップレット上にある場合、 host このようになります:host: server_ip_address.

注:本番環境では、構成値を次のような別のファイルに保持することをお勧めします。 .env ファイル。 その後、このファイルはに追加されます .gitignore バージョン管理で追跡しないようにGitを使用する場合はファイル。 利点は、あなたのような機密情報を隠すことです password, user、 と database 攻撃者から。

インスタンスを作成すると、データベース接続が確立され、 Pool オブジェクトはに保存されます pool 変数。 これをアプリのどこでも使用するには、エクスポートする必要があります。 あなたの中で db.js ファイル、要求し、のインスタンスを定義します Pool オブジェクト、およびそのプロパティと値を設定します。

node_pg_app / db.js
const { Pool } = require("pg");

const pool = new Pool({
  user: "fish_user",
  database: "fish",
  password: "password",
  port: 5432,
  host: "localhost",
});

module.exports = { pool };

ファイルを保存して終了します nano を押すことによって CTRL+X. 入る y 変更を保存し、を押してファイル名を確認します ENTER また RETURN Macのキー。

アプリケーションをPostgresに接続したので、この接続を使用してPostgresにデータを挿入します。

ステップ5—Postgresデータベースへのデータの挿入

このステップでは、で作成した接続プールを使用してPostgreSQLデータベースにデータを追加するプログラムを作成します。 db.js ファイル。 プログラムが実行されるたびに異なるデータを挿入するようにするには、コマンドライン引数を受け入れる機能をプログラムに与えます。 プログラムを実行するときに、サメの名前と色を渡します。

作成して開く insertData.js エディター内のファイル:

  1. nano insertData.js

あなたの中で insertData.js ファイルに次のコードを追加して、スクリプトにコマンドライン引数を処理させます。

node_pg_app / insertData.js
const { pool } = require("./db");

async function insertData() {
  const [name, color] = process.argv.slice(2);
  console.log(name, color);
}

insertData();

まず、 pool からのオブジェクト db.js ファイル。 これにより、プログラムはデータベース接続を使用してデータベースにクエリを実行できます。

次に、宣言します insertData() 非同期関数として機能します async キーワード。 これにより、 await データベース要求を非同期にするキーワード。

以内 insertData() 関数、あなたは使用します process コマンドライン引数にアクセスするためのモジュール。 Node.js process.argv メソッドは、配列内のすべての引数を返します。 nodeinsertData.js 引数。

たとえば、ターミナルでスクリプトを実行すると、 node insertData.js sammy blueprocess.argv メソッドは配列を返します: ['node', 'insertData.js', 'sammy', 'blue'] (配列は簡潔にするために編集されています)。

最初の2つの要素をスキップするには: nodeinsertData.js、JavaScriptを追加します slice() 方法 process.argv 方法。 これにより、インデックス2以降の要素が返されます。 次に、これらの引数は次のように分解されます。 namecolor 変数。

ファイルを保存して終了します nanoCTRL+X. を使用してファイルを実行します node それに引数を渡します sammy、 と blue:

  1. node insertData.js sammy blue

コマンドを実行すると、次の出力が表示されます。

Output
sammy blue

これで、関数はにアクセスできるようになります name とサメ color コマンドライン引数から。 次に、を変更します insertData() データをに挿入する関数 shark テーブル。

を開きます insertData.js テキストエディタでファイルを再度作成し、強調表示されたコードを追加します。

node_pg_app / insertData.js
const { pool } = require("./db");

async function insertData() {
  const [name, color] = process.argv.slice(2);
  const res = await pool.query(
      "INSERT INTO shark (name, color) VALUES ($1, $2)",
      [name, color]
    );
  console.log(`Added a shark with the name ${name}`);
}

insertData();

さて、 insertData() 関数はを定義します namecolor サメの。 次に、それは待っています pool.query からの方法 node-postgres SQLステートメントを取ります INSERT INTO shark (name, color) ... 最初の引数として。 SQLステートメントはレコードをに挿入します shark テーブル。 これは、パラメーター化されたクエリと呼ばれるものを使用します。 $1、 と $2 に対応します namecolor で提供される配列内の変数 pool.query() 2番目の引数としてのメソッド: [name, color]. Postgresがステートメントを実行しているとき、変数はSQLインジェクションからアプリケーションを安全に保護するために置き換えられます。 クエリの実行後、関数は次を使用して成功メッセージをログに記録します console.log().

スクリプトを実行する前に、コードを内部にラップします insertData() try … catch ブロックで関数を実行して、ランタイムエラーを処理します。

node_pg_app / insertData.js
const { pool } = require("./db");

async function insertData() {
  const [name, color] = process.argv.slice(2);
  try {
    const res = await pool.query(
      "INSERT INTO shark (name, color) VALUES ($1, $2)",
      [name, color]
    );
    console.log(`Added a shark with the name ${name}`);
  } catch (error) {
    console.error(error)
  }
}

insertData()

関数が実行されると、内部のコードは try ブロックが実行されます。 成功した場合、関数はスキップします catch ブロックして終了します。 ただし、エラーが内部でトリガーされた場合 try ブロック、 catch ブロックが実行され、コンソールにエラーが記録されます。

これで、プログラムはコマンドライン引数を取り、それらを使用してレコードを shark テーブル。

保存して、テキストエディタを終了します。 を実行します insertData.js とファイル sammyblue コマンドライン引数として:

  1. node insertData.js sammy blue

次の出力が表示されます。

Output
Added a shark with the name sammy

コマンドを実行すると、名前がサメのテーブルにレコードが挿入されます sammy と色 blue.

次に、でファイルを再実行します joseteal コマンドライン引数として:

  1. node insertData.js jose teal

出力は次のようになります。

Output
Added a shark with the name jose

これは、別のレコードをに挿入したことを確認します shark 名前のテーブル jose と色 teal.

これで、2つのレコードが挿入されました shark テーブル。 次のステップでは、データベースからデータを取得します。

ステップ6—Postgresデータベースからデータを取得する

このステップでは、内のすべてのレコードを取得します shark 使用するテーブル node-postgres、コンソールにログインします。

ファイルを作成して開きます retrieveData.js お気に入りのエディターで:

  1. nano retrieveData.js

あなたの中で retrieveData.js、データベースからデータを取得するには、次のコードを追加します。

node_pg_app / retrieveData.js
const { pool } = require("./db");

async function retrieveData() {
  try {
    const res = await pool.query("SELECT * FROM shark");
    console.log(res.rows);
  } catch (error) {
    console.error(error);
  }
}

retrieveData()

The retrieveData() 関数は、内のすべての行を読み取ります shark テーブルを作成し、コンソールに記録します。 関数内 try ブロック、あなたは pool.query() からの方法 node-postgres 引数としてSQLステートメントを使用します。 SQLステートメント SELECT * FROM shark 内のすべてのレコードを取得します shark テーブル。 それらが取得されると、 console.log() ステートメントは行をログに記録します。

エラーがトリガーされた場合、実行はスキップされます catch ブロックし、エラーをログに記録します。 最後の行で、 retrieveData() 関数。

次に、エディターを保存して閉じます。 を実行します retrieveData.js ファイル:

  1. node retrieveData.js

次のような出力が表示されます。

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

node-postgres JSONのようなオブジェクトでテーブルの行を返します。 これらのオブジェクトは配列に格納されます。

これで、データベースからデータを取得できます。 次に、を使用してテーブル内のデータを変更します node-postgres.

ステップ7—Postgresデータベースのデータを変更する

このステップでは、 node-postgres Postgresデータベースのデータを変更します。 これにより、いずれかのデータを変更できます。 shark テーブルレコード。

2つのコマンドライン引数を取るスクリプトを作成します。 idname. を使用します id テーブルに必要なレコードを選択するための値。 The name 引数は、名前を変更するレコードの新しい値になります。

を作成して開きます modifyData.js ファイル:

  1. nano modifyData.js

あなたの中で modifyData.js ファイルに次のコードを追加して、のレコードを変更します shark テーブル:

node_pg_app / modifyData.js
const { pool } = require("./db");

async function modifyData() {
  const [id, name] = process.argv.slice(2);
  try {
    const res = await pool.query("UPDATE shark SET name = $1 WHERE id = $2", [
      name,
      id,
    ]);
    console.log(`Updated the shark name to ${name}`);
  } catch (error) {
    console.error(error);
  }
}

modifyData();

まず、あなたは pool からのオブジェクト db.js あなたのファイル modifyData.js ファイル。

次に、非同期関数を定義します modifyData() Postgresのレコードを変更します。 関数内で、2つの変数を定義します idname 破壊的割り当てを使用してコマンドライン引数から。

以内 try ブロック、あなたは pool.query からの方法 node-postgres 最初の引数としてSQLステートメントを渡します。 に UPDATE SQLステートメント、 WHERE 句は、に一致するレコードを選択します id 価値。 選択したら、 SET name = $1 名前フィールドの値を新しい値に変更します。

次、 console.log レコード名が変更されると実行されるメッセージをログに記録します。 最後に、あなたは modifyData() 最後の行で機能します。

を使用してファイルを保存して終了します CTRL+X. を実行します modifyData.js とファイル 2san 引数として:

  1. node modifyData.js 2 san

次の出力が表示されます。

Output
Updated the shark name to san

レコード名がから変更されたことを確認するには josesan、を実行します retrieveData.js ファイル:

  1. node retrieveData.js

次のような出力が得られます。

Output
output [ { id: 1, name: 'sammy', color: 'blue' }, { id: 2, name: 'san', color: 'teal' } ]

これで、IDを持つレコードが表示されます。 2 新しい名前になりました san 交換 jose.

これで、を使用してデータベース内のレコードを正常に更新できました。 node-postgres.

結論

このチュートリアルでは、 node-postgres Postgresデータベースに接続してクエリを実行します。 まず、Postgresでユーザーとデータベースを作成しました。 次に、テーブルを作成し、を使用してアプリケーションをPostgresに接続しました node-postgres、およびを使用してPostgresでデータを挿入、取得、および変更します node-postgres モジュール。

詳細については node-postgresドキュメントにアクセスしてください。 Node.jsのスキルを向上させるために、Node.jsシリーズのコーディング方法を調べることができます。