📖 Scenario: You are building a simple Node.js app that connects to a PostgreSQL database to fetch user data.
🎯 Goal: Create a Node.js script that connects to PostgreSQL using the pg library, sets up connection configuration, queries the database for all users, and closes the connection properly.
📋 What You'll Learn
Use the pg library to connect to PostgreSQL
Create a client with exact connection parameters
Write an async function to query all rows from the users table
Close the database connection after the query
💡 Why This Matters
🌍 Real World
Connecting Node.js apps to PostgreSQL databases is common for web apps, APIs, and data processing.
💼 Career
Backend developers often use pg to interact with PostgreSQL databases for data storage and retrieval.
Progress0 / 4 steps
1
Import pg and create a client
Write import { Client } from 'pg' at the top and create a new Client instance called client with no parameters yet.
Node.js
Hint
Use ES module import syntax and create a client with new Client().
2
Add connection configuration
Modify the Client instance to include these exact connection parameters: user: 'testuser', host: 'localhost', database: 'testdb', password: 'testpass', and port: 5432.
Node.js
Hint
Pass an object with the exact keys and values to new Client().
3
Write async function to query users
Write an async function called fetchUsers that connects the client, runs SELECT * FROM users query using client.query, stores the result in res, and returns res.rows.
Node.js
Hint
Use await client.connect() before querying and return res.rows.
4
Close the client connection
Add a line inside fetchUsers after getting the rows to close the client connection using await client.end().
Node.js
Hint
Call await client.end() to close the connection after the query.
Practice
(1/5)
1. What is the main purpose of the pg library in Node.js?
easy
A. To connect and interact with PostgreSQL databases
B. To create web servers
C. To manage file uploads
D. To style web pages
Solution
Step 1: Understand the role of pg
The pg library is designed specifically to connect Node.js applications to PostgreSQL databases.
Step 2: Compare with other options
Creating web servers, managing file uploads, and styling pages are unrelated to database connections and are handled by other libraries.
Final Answer:
To connect and interact with PostgreSQL databases -> Option A
Quick Check:
pg = PostgreSQL connection [OK]
Hint: Remember pg is for PostgreSQL database connection [OK]
Common Mistakes:
Confusing pg with web server libraries
Thinking pg handles frontend styling
Assuming pg manages file uploads
2. Which of the following is the correct way to create a new Client instance from the pg library?
easy
A. const client = pg.connect('postgresql://user:pass@localhost/db');
B. const client = new pg.Client({ connectionString: 'postgresql://user:pass@localhost/db' });
C. const client = new Client.connect('postgresql://user:pass@localhost/db');
D. const client = pg.new Client('postgresql://user:pass@localhost/db');
Solution
Step 1: Recall the correct Client creation syntax
The pg library requires creating a new Client instance using new pg.Client() with a config object.
Step 2: Check each option's syntax
const client = new pg.Client({ connectionString: 'postgresql://user:pass@localhost/db' }); correctly uses new pg.Client({ connectionString: ... }). Options B, C, and D use invalid syntax or methods that do not exist.
Final Answer:
const client = new pg.Client({ connectionString: 'postgresql://user:pass@localhost/db' }); -> Option B
Quick Check:
Use new pg.Client with config object [OK]
Hint: Use 'new pg.Client' with config object for connection [OK]
Common Mistakes:
Calling pg.connect directly without new Client
Using incorrect method names like Client.connect
Missing the 'new' keyword when creating Client
3. What will the following code output if the query succeeds?
const { Client } = require('pg');
const client = new Client({ connectionString: 'postgresql://user:pass@localhost/db' });
async function run() {
await client.connect();
const res = await client.query('SELECT 1 AS number');
console.log(res.rows[0].number);
await client.end();
}
run();
medium
A. 1
B. [{ number: 1 }]
C. undefined
D. Error: query failed
Solution
Step 1: Understand the query and result structure
The query SELECT 1 AS number returns one row with a column named 'number' having value 1.
Step 2: Check how the result is accessed
The code logs res.rows[0].number, which accesses the first row's 'number' field, so it prints 1.
Final Answer:
1 -> Option A
Quick Check:
res.rows[0].number = 1 [OK]
Hint: Access query result via res.rows[0].columnName [OK]
Common Mistakes:
Logging res.rows instead of a specific field
Expecting the whole array instead of one value
Not awaiting client.connect() before query
4. Identify the error in this code snippet that uses pg to connect to PostgreSQL:
The client.connect() method returns a promise and must be awaited to ensure connection before querying.
Step 2: Verify other async calls
The await before client.query() is correct. Calling client.end() after query is also correct.
Final Answer:
Missing await before client.connect() -> Option D
Quick Check:
Always await client.connect() before queries [OK]
Hint: Always await client.connect() before querying [OK]
Common Mistakes:
Not awaiting client.connect() causing race conditions
Awaiting client.query() is correct, so skipping it is wrong
Calling client.end() too early before query finishes
5. You want to write a Node.js function using pg that connects to PostgreSQL, runs a query, and always closes the connection even if an error occurs. Which pattern is best?
hard
A. Call connect, query, and end sequentially without error handling
B. Only call client.end() if query succeeds, skip on error
C. Use try-catch-finally: connect in try, query in try, close in finally
D. Use callbacks instead of async/await for better error handling
Solution
Step 1: Understand error-safe connection handling
To ensure the connection closes even if an error happens, use a try-catch-finally block where client.end() is called in the finally block.
Step 2: Evaluate options for best practice
Use try-catch-finally: connect in try, query in try, close in finally correctly uses try-catch-finally. Call connect, query, and end sequentially without error handling lacks error handling. Only call client.end() if query succeeds, skip on error risks leaving connection open on errors. Use callbacks instead of async/await for better error handling is outdated compared to async/await.
Final Answer:
Use try-catch-finally: connect in try, query in try, close in finally -> Option C
Quick Check:
try-catch-finally ensures connection closes [OK]
Hint: Use try-catch-finally to always close connection [OK]
Common Mistakes:
Not closing connection on errors
Ignoring async/await for error handling
Closing connection only on success
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.