Sunteți pe pagina 1din 39

Setting up a RESTful API with

Node.js and PostgreSQL


October 31, 2018 · 11 min read

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
An extremely important aspect of being a modern web developer is
knowing how to work with APIs to facilitate communication between
di erent software systems.

In this tutorial, you’ll learn how to create your own RESTful API in a
Node.js environment running on an Express server and utilizing a
PostgreSQL database.

Prerequisites
In order to get the most out of this tutorial, there are a few
prerequisites:

You should be familiar with JavaScript syntax and fundamentals


You should have basic knowledge of working with the command
line
You should have Node.js and npm installed

Goals
By the time you complete this article, you should have a fully
functional API server running on an Express framework in Node.js. The
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
API should be able to handle the HTTP request methods that
correspond to the PostgreSQL database that the API gets its data from.
You will learn how to install PostgreSQL and work with it through the
command line interface.

What is a RESTful API?


REST stands for Representational State Transfer and defines a set of
standards for web services. An API is an interface that di erent
software programs use to communicate with each other. Therefore, a
RESTful API is an API that conforms to the REST architectural style and
constraints. REST systems are stateless, scalable, cacheable, and have
a uniform interface.

RESTful APIs most commonly utilize HTTP requests. Four of the most
common HTTP methods are GET , POST , PUT , and DELETE , which are
the methods by which a developer can create a CRUD system – create,
read, update, delete.

PostgreSQL database

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
PostgreSQL, commonly referred to as Postgres, is a free and open
source relational database management system. You might be familiar
with a few other similar database systems, such as MySQL, Microsoft
SQL Server, or MariaDB, which compete with PostgreSQL.

PostgreSQL is a robust but stable relational database that has been


around since 1997 and is available on all major operating systems —
Linux, Windows, and macOS. Since PostgreSQL is known for stability,
extensibility, and standards compliance, it’s a popular choice for
developers and companies to use for their database needs.

We’ll begin this tutorial by installing PostgreSQL, creating a new user,


creating a database, and initializing a table with schema and some
data.

Installation
If you’re using Windows, download a Windows installer of PostgreSQL.

If you’re using a Mac, this tutorial assumes you have Homebrew


installed on your computer as a package manager for installing new

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
programs. If you don’t, simply click on the link and follow the
instructions to install Homebrew.

Open up the Terminal and install postgresql with brew .

brew install postgresql

You may see instructions on the web that will say brew install
postgres instead of postgresql . Both of these options will install

PostgreSQL on your computer.

After the installation is complete, we’ll want to get the postgresql up


and running, which we can do with services start .

brew services start postgresql


==> Successfully started `postgresql` (label: homebrew.mxcl.postg

If at any point you want to stop the postgresql service, you can run
brew services stop postgresql .

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
PostgreSQL is installed now, so the next step is to connect to the
postgres command line, where we can run SQL commands.

PostgreSQL command prompt


psql is the PostgreSQL interactive terminal. Running psql will

connect you to a PostgreSQL host. Running psql --help will give you
more information about the available options for connecting with
psql .

--h — --host=HOSTNAME | database server host or socket

directory (default: “local socket”)


--p — --port=PORT | database server port (default: “5432”)

--U — --username=USERNAME | database username (default:

“your_username”)
--w — --no-password | never prompt for password

--W — --password | force password prompt (should happen

automatically)

We’ll just connect to the default postgres database with the default
login information – no option flags.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
psql postgres

You’ll see that we’ve entered into a new connection. We’re now inside
psql in the postgres database. The prompt ends with a # to denote

that we’re logged in as the superuser, or root.

postgres=#

Commands within psql start with a backslash ( \ ). To test our first


command, we can ensure what database, user, and port we’ve
connected to by using the \conninfo command.

postgres=# \conninfo
You are connected to database "postgres" as user "your_username"

Here is a reference table of a few common commands which we’ll be


using in this tutorial.

\q | Exit psql connection

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
\c | Connect to a new database

\dt | List all tables

\du | List all roles

\list | List databases

Let’s create a new database and user so we’re not using the default
accounts, which have superuser privileges.

Create a user
First, we’ll create a role called me and give it a password of password .
A role can function as a user or a group, so in this case, we’ll be using it
as a user.

postgres=# CREATE ROLE me WITH LOGIN PASSWORD 'password';

We want me to be able to create a database.

postgres=# ALTER ROLE me CREATEDB;

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
You can run \du to list all roles/users.

me | Create DB | {}
postgres | Superuser, Create role, Create DB | {}

Now we want to create a database from the me user. Exit from the
default session with \q for quit.

postgres=# \q

We’re back in our computer’s default Terminal connection. Now we’ll


connect postgres with me .

psql -d postgres -U me

Instead of postgres=# , our prompt shows postgres=> now, meaning


we’re no longer logged in as a superuser.

Create a database
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
We can create a database with the SQL command.

postgres=> CREATE DATABASE api;

Use the \list command to see the available databases.

Name | Owner | Encoding | Collate | Ctype |


api | me | UTF8 | en_US.UTF-8 | en_US.UTF-8 |

Let’s connect to the new api database with me using the \c


(connect) command.

postgres=> \c api
You are now connected to database "api" as user "me".
api=>

Our prompt now displays that we’re connected to api .

Create a table

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
The last thing we’ll do in the psql command prompt is create a table
called users with three fields – two VARCHAR types and an auto-
incrementing PRIMARY KEY id.

api=>
CREATE TABLE users (
ID SERIAL PRIMARY KEY,
name VARCHAR(30),
email VARCHAR(30)
);

Make sure not to use the backtick (`) character when creating and
working with tables in PostgreSQL. While backticks are allowed in
MySQL, they’re not valid in PostgreSQL. Also, ensure you do not have a
trailing comma in the CREATE TABLE command.

We’ll add two entries to users to have some data to work with.

INSERT INTO users (name, email)


VALUES ('Jerry', 'jerry@example.com'), ('George', 'george@examp

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Let’s make sure that got added correctly by getting all entries in
users .

api=> SELECT * FROM users;


id | name | email
----+--------+--------------------
1 | Jerry | jerry@example.com
2 | George | george@example.com

Now we have a user, database, table, and some data. We can begin
building our Node.js RESTful API to connect to this data stored in a
PostgreSQL database.

Setting up an Express server


At this point, we’re finished with all of our PostgreSQL tasks, and we
can begin setting up our Node.js app and Express server.

Create a directory for the project to live.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
mkdir node-api-postgres
cd node-api-postgres

You can either run npm init -y to create a package.json , or copy the
code below into a package.json file.

{
"name": "node-api-postgres",
"version": "1.0.0",
"description": "RESTful API with Node.js, Express, and PostgreS
"main": "index.js",
"license": "MIT"
}

We’ll want to install Express for the server and node-postgres (pg) to
be able to connect to PostgreSQL.

npm i express pg

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Now we have our dependencies loaded into node_modules and
package.json .

Create an index.js file, which we’ll use as the entry point for our
server. At the top, we’ll require the express module, built in
bodyParser middleware, and set our app and port variables.

const express = require('express')


const bodyParser = require('body-parser')
const app = express()
const port = 3000

app.use(bodyParser.json())
app.use(
bodyParser.urlencoded({
extended: true,
})
)

We’ll tell a route to look for a GET request on the root ( / ) URL, and
return some JSON.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
app.get('/', (request, response) => {
response.json({ info: 'Node.js, Express, and Postgres API' })
})

Now set the app to listen on the port you set.

app.listen(port, () => {
console.log(`App running on port ${port}.`)
})

From the command line, we can start the server by hitting index.js .

node index.js
App running on port 3000.

Go to http://localhost:3000 in the URL bar of your browser, and


you’ll see the JSON we set earlier.

{
info: "Node.js, Express, and Postgres API"

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
}

The Express server is running now, but it’s only sending some static
JSON data that we created. The next step is to connect to PostgreSQL
from Node.js to be able to make dynamic queries.

Connecting to the database from Node.js


We’ll be using the node-postgres module to create a pool of
connections. This way we don’t have to open a client and close it every
time we make a query.

A popular option for production pooling would be to use pgBouncer, a


lightweight connection pooler for PostgreSQL.

Create a file called queries.js and set up the configuration of your


PostgreSQL connection.

const Pool = require('pg').Pool


const pool = new Pool({
user: 'me',

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
host: 'localhost',
database: 'api',
password: 'password',
port: 5432,
})

In a production environment, you would want to put your


configuration details in a separate file with restrictive permissions that
is not accessible from version control, but for the simplicity of this
tutorial , we’re keeping it in the same file as the queries.

The aim of this tutorial is to allow GET , POST , PUT , and DELETE
operations on the API which will run the corresponding database
commands. To do this we’ll set up a route for each endpoint, and a
function to correspond to each query.

Creating routes
We’re going to create six functions for six routes, seen in the chart
below. First, we’ll go through and create all of the functions for each
route, then we’ll export the functions so they’re accessible:

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
GET — / | displayHome()

GET — /users | getUsers()

GET — /users/:id | getUserById()

POST — users | createUser()

PUT — /users/:id | updateUser()

DELETE — /users/:id | deleteUser()

In index.js , we made an app.get() for the root endpoint with a


function in it. Now in queries.js , we’ll create endpoints that will
display all users, display a single user, create a new user, update an
existing user, and delete a user.

GET all users


Our first endpoint will be a GET request. Inside the pool.query() we
can put the raw SQL that will touch the api database. We’ll SELECT all
users and order by id.

const getUsers = (request, response) => {


pool.query('SELECT * FROM users ORDER BY id ASC', (error, resul
if (error) {

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
throw error
}
response.status(200).json(results.rows)
})
}

GET a single user by id


For our /users/:id request, we’ll be getting the custom id
parameter by the URL and using a WHERE clause to display the result.

In the SQL query, we’re looking for id=$1 . In this instance, $1 is a


numbered placeholder, which PostgreSQL uses natively instead of the
? placeholder you may be familiar with from other flavors of SQL.

const getUserById = (request, response) => {


const id = parseInt(request.params.id)

pool.query('SELECT * FROM users WHERE id = $1', [id], (error,


if (error) {
throw error

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
}
response.status(200).json(results.rows)
})
}

POST a new user


<p”>The API will take a GET and POST request to the /users
endpoint. In the POST request, we’ll be adding a new user. In this
function, we’re extracting the name and email properties from the
request body, and INSERT ing the values.

const createUser = (request, response) => {


const { name, email } = request.body

pool.query('INSERT INTO users (name, email) VALUES ($1, $2)',


if (error) {
throw error
}
response.status(201).send(`User added with ID: ${result.inse

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
})
}

PUT updated data in an existing user


The /users/:id endpoint will also take two HTTP requests — the GET
we created for getUserById , and also a PUT , to modify an existing
user. For this query, we’ll combine what we learned in GET and POST
to use the UPDATE clause.

It is worth noting that PUT is idempotent, meaning the exact same call
can be made over and over and will produce the same result. This is
di erent than POST , in which the exact same call repeated will
continuously make new users with the same data.

const updateUser = (request, response) => {


const id = parseInt(request.params.id)
const { name, email } = request.body

pool.query(

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
'UPDATE users SET name = $1, email = $2 WHERE id = $3',
[name, email, id],
(error, results) => {
if (error) {
throw error
}
response.status(200).send(`User modified with ID: ${id}`)
}
)
}

DELETE a user
Finally, we’ll use the DELETE clause on /users/:id to delete a specific
user by id. This call is very similar to our getUserById() function.

const deleteUser = (request, response) => {


const id = parseInt(request.params.id)

pool.query('DELETE FROM users WHERE id = $1', [id], (error, res


if (error) {
throw error

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
}
response.status(200).send(`User deleted with ID: ${id}`)
})
}

Export
In order to access these functions from index.js , we’ll need to export
them. We can do this with module.exports , creating an object of
functions. Since we’re using ES6 syntax, we can write getUsers
instead of getUsers:getUsers , and so on.

module.exports = {
getUsers,
getUserById,
createUser,
updateUser,
deleteUser,
}

Here is our complete queries.js file.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
const Pool = require('pg').Pool
const pool = new Pool({
user: 'me',
host: 'localhost',
database: 'api',
password: 'password',
port: 5432,
})
const getUsers = (request, response) => {
pool.query('SELECT * FROM users ORDER BY id ASC', (error, res
if (error) {
throw error
}
response.status(200).json(results.rows)
})
}

Completing the setup


Now that we have all of our queries, the last thing we need to do is pull
them into the index.js file and make endpoint routes for all the query

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
functions we created.

To get all the exported functions from queries.js , we’ll require the
file and assign it to a variable.

const db = require('./queries')

Now for each endpoint, we’ll set the HTTP request method, the
endpoint URL path, and the relevant function.

app.get('/users', db.getUsers)
app.get('/users/:id', db.getUserById)
app.post('/users', db.createUser)
app.put('/users/:id', db.updateUser)
app.delete('/users/:id', db.deleteUser)

Here is our complete index.js , the entry point of the API server.

const express = require('express')


const bodyParser = require('body-parser')

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
const app = express()
const db = require('./queries')
const port = 3000

app.use(bodyParser.json())
app.use(
bodyParser.urlencoded({
extended: true,
})
)

app.get('/', (request, response) => {


response.json({ info: 'Node.js, Express, and Postgres API' })
})

Now with just these two files, we have a server, database, and API all
set up. You can start up the server by hitting index.js again.

node index.js
App running on port 3000.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Now if you go to http://localhost:3000/users or
http://localhost:3000/users/1 , you’ll see the JSON response of the

two GET requests. But how can we test our POST , PUT , and DELETE
requests?

This can be done with curl, a command line tool that’s already
available on your terminal. Below are examples you can run on the
command line to test all of the protocols.

Make sure that the server is actively running in one Terminal window
while you run these commands in a separate window.

POST
Add a new user with the name Elaine and email elaine@example.com.

curl --data "name=Elaine&email=elaine@example.com"


http://localhost:3000/users

PUT
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Update the user with id 1 to have the name Kramer and email
kramer@example.com.

curl -X PUT -d "name=Kramer" -d "email=kramer@example.com"


http://localhost:3000/users/1

DELETE
Delete the user with id 1 .

curl -X "DELETE" http://localhost:3000/users/1

Conclusion
Congratulations, you should now have a functioning API server
running on Node.js and hooked up to an active PostgreSQL database. In
this tutorial, we learned how to install and set up PostgreSQL in the
command line, how to create users, databases, and tables, and how to
run SQL commands. We also learned how to create an Express server

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
that can handle multiple HTTP methods, and how to use the pg
module to connect to PostgreSQL from Node.

With this knowledge, you should be able to build on this API and utilize
it for your own personal or professional development projects.

Plug: LogRocket, a DVR for web apps

LogRocket is a frontend logging tool that lets you replay problems as if


they happened in your own browser. Instead of guessing why errors
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
happen, or asking users for screenshots and log dumps, LogRocket lets
you replay the session to quickly understand what went wrong. It
works perfectly with any app, regardless of framework, and has
plugins to log additional context from Redux, Vuex, and @ngrx/store.

In addition to logging Redux actions and state, LogRocket records


console logs, JavaScript errors, stacktraces, network
requests/responses with headers + bodies, browser metadata, and
custom logs. It also instruments the DOM to record the HTML and CSS
on the page, recreating pixel-perfect videos of even the most complex
single-page apps.

Try it for free.

Share this:

 Twitter  Reddit  LinkedIn  Facebook

Tania Rascia Follow

Software developer, writer, maker of things. (http://tania.dev )

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
#node #postgresql

« Full-stack observability: LogRocket, Why you should avoid ORMs (with


DataDog, Honeycomb examples in Node.js) »

The best Rust frameworks to Rust for front-end developers Understanding lazy loading in
check out in 2019 JavaScript
Obinna Ekwuno
Obinna Ekwuno Oct 17, 2019 · 6 min read Alexander Nnakwue
Oct 18, 2019 · 5 min read Oct 17, 2019 · 6 min read

21 Replies to “Setting up a RESTful API with Node.js and PostgreSQL”

Adnan Says: Reply

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
June 10, 2019 at 10:56 pm

Can you make a tutorial of user registration using react native with the
PostgreSQL and inserting the data with the button onPress function , what i
mean is a restful api with node.js using react native with the PostgreSQL and
just add new user into database….
Thanks

Pierre Bastien Says: Reply


June 16, 2019 at 3:26 pm

Thanks for this tutorial. I was getting an error like “Cannot GET /users” and the
resolution was to stop and start node index.js – in case anyone else gets stuck
on that

Vijay Kumar Kanta Says: Reply


June 22, 2019 at 11:32 am

I don’t really know why this brilliant tutorial doesn’t have many likes or
comments. It’s perfect for a Node newbie looking to intercept the postgres
world to build apis. Thanks very much!!

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Vicky Says: Reply
June 25, 2019 at 10:06 am

This is going to be a wonderful blog in no time.

Anna Says: Reply


June 28, 2019 at 12:32 am

This was incredible. Thank you so much. I’ve been having so many issues
connecting to postgres that I thought it was going to take me forever to connect
locally as well.
Note to anybody who might have permission issues connecting with your
created user, you might have to grant read access instead of just creating a
database: https://dba.stackexchange.com/questions/36870/permission-
denied-in-postgres

just change myuser and paste the rest into postgres


for read access
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
for inserting data
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

Agung Effendi Says: Reply

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
July 2, 2019 at 10:28 pm

absolutely nice starting guide for me, theres a bit mistype in your create user
response, just change to “results” and you good to go, anyway thanks… your
starting guide helps me understand node works

James Says: Reply


July 3, 2019 at 12:08 am

This is a fantastic tutorial. Very well explained and thought out.

RS Says: Reply
July 21, 2019 at 8:45 am

Real good

Justin Says: Reply


July 25, 2019 at 8:49 pm

Great tutorial. Just a note, some of the Github examples are blank

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Artemis Says: Reply
July 30, 2019 at 10:59 am

Awesome! To the point, and actually got it working within a couple of


hours.Thanks!

Damien Diehl Says: Reply


July 31, 2019 at 11:51 am

Thanks for the tutorial, this was really helpful getting me started on making a
backend for my apps

I had only one issue, the setup with the bodyParser middleware (`app.use()`
lines) was preventing my browser from connecting to Express. The server
would start via CLI fine, but I was getting “waiting for localhost” when trying
to hit the server from Firefox & Chrome. Starting Express in debug mode didn’t
show anything indicative.. But after removing those lines, the rest of the
tutorial worked fine! I’m going to investigate what the bodyParser component
is meant for because it’s likely I’m skipping something important

Jyoti Sachdeva Says: Reply


August 12, 2019 at 11:39 am

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Awesome tutorial. Real help for beginners. With your step by step approach you
explained everything so clearly. Thanks!

Rayan Says: Reply


August 16, 2019 at 9:03 am

Hello there !
I got through the whole tutorial (which is really clear and great, thanks for that
!), and I guess this is going to be a pretty stupid question (fairly new to
Node/Express/APIs), but I’m on Windows, and the curls commands to POST
and UPDATE don’t work, only the DELETE one those.
When I try, it returns an error :
“Cannot destructure property `name` of undefined or null;”

In any case thanks again for this tutorial !

Sean Says: Reply


August 22, 2019 at 9:50 pm

Where is this field (${results.INSERTID}) coming from? I am not seeing this


field in the results object.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Ali G Says: Reply
August 23, 2019 at 10:08 am

@ryan this means that you are trying to access name from a variable which is
undefined

request.body is undefined and you are trying to get the name data which will
throw this error

Simon Says: Reply


August 25, 2019 at 10:02 pm

Thanks. Good tutorial. How may I add a data validation?

Ollie Says: Reply


August 29, 2019 at 8:34 pm

This was really straight forward and helpful, thanks

G Says: Reply
September 3, 2019 at 10:46 am

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Thanks for this article. Helped a novice like me to start on Nodejs and PostGres.
As token of thanks…was getting undefined for results.insertId for insert POST
api. I replaced that by response.status(201).send(`User added with ID:
${results.rows[0].id}`) to get the last inserted id.

Reet Chowdhary Says: Reply


September 22, 2019 at 11:57 pm

Amazing tutorial! Thank you so much

Francisco Susana Says: Reply


October 11, 2019 at 3:41 pm

I solved this issue by adding the bodyParser.json() middelware in the app.post


as follows:

app.post(‘/users’, bodyParser.json(), db.createUser);

Yao David Says: Reply


October 15, 2019 at 11:13 pm

One of the best tutorials I have ever seen on the internet world! Great job~

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Leave a Reply

Enter your comment here...

We just moved our blog! Does something seem off? Email support@logrocket.com
Search... >

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD

S-ar putea să vă placă și