In this project, we will go over how to use massive with a node server to connect to a postgres database.
- Run
npm install. - Review the
index.jsfile to get familiar with it.
In this step, we'll install massive into our project and require it in index.js.
- Run
npm install --save massive dotenv - Require
massiveunderneathcors. - Require and configure dotenv below massive.
index.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const massive = require('massive');
require('dotenv').config()
const app = express();
app.use( bodyParser.json() );
app.use( cors() );
const port = process.env.PORT || 3000
app.listen(port, () => { console.log(`Server listening on port ${port}`) } );In this step, we'll connect SQLTabs to our Heroku databse. We'll then add a new table to our Heroku database called airplanes.
- Open SQLTabs.
- Connect to your Heroku database with SQLTabs by using the URI connection string.
- Create the following
airplanestable:-
CREATE TABLE airplanesCREATE TABLE airplanes ( PlaneID SERIAL PRIMARY KEY NOT NULL, PlaneType varchar(40) NOT NULL, PassengerCount integer NOT NULL );
-
In this step, we'll establish a connection to our database using massive in index.js.
- Open
index.js. - Create a file named
.env- Make sure to add
.envto your.gitignore
- Make sure to add
- Open your
.envand add a variable namedCONNECTION_STRINGthat equals the URI connection string from your Heroku database.- Make sure to add
?ssl=trueat end of your connection string. - There should be no quotes around the connection string.
- Make sure to add
- Invoke massive and pass in the connection string by accessing the variable
CONNECTION_STRINGfrom the.envfile on the process objectprocess.env.CONNECTION_STRING. This will return a promise. Chain a.thenthat has one parameter calleddbInstanceand then returnsapp.set('db', dbInstance). This will give our express application access to our database.
.env
CONNECTION_STRING=postgres://username:password@host/dbname?ssl=true
index.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const massive = require('massive');
require('dotenv').config()
const app = express();
massive( process.env.CONNECTION_STRING ).then( dbInstance => app.set('db', dbInstance) );
app.use( bodyParser.json() );
app.use( cors() );
const port = process.env.PORT || 3000
app.listen(port, () => { console.log(`Server listening on port ${port}`) } );In this step, we will add some seed data to our database using the the files already created in the db folder.
- Open
index.js. - Modify the massive
.thento setdbon app and also calldbInstance.new_planes.- Chain a
.thenthat has a parameter calledplanes. Return aconsole.logofplanes. - Chain a
.catchthat has a parameter callederr. Return aconsole.logoferr.
- Chain a
- Restart/Run the API so the planes get added to the table.
- Comment out
dbInstance.new_planesso we don't get duplicate planes.
index.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const massive = require('massive');
require('dotenv').config()
const app = express();
massive( process.env.CONNECTION_STRING ).then( dbInstance => {
app.set('db', dbInstance);
// dbInstance.new_planes()
// .then( planes => console.log( planes ) )
// .catch( err => console.log( err ) );
});
app.use( bodyParser.json() );
app.use( cors() );
const port = process.env.PORT || 3000
app.listen(port, () => { console.log(`Server listening on port ${port}`) } );- Open
index.js. - Underneath the comment of
new_planes, calldbInstance.get_planes.- Chain a
.thenthat has a parameter calledplanes. Return aconsole.logofplanes. - Chain a
.catchthat has a parameter callederr. Return aconsole.logoferr.
- Chain a
index.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const massive = require('massive');
require('dotenv').config()
const app = express();
massive( process.env.CONNECTION_STRING ).then( dbInstance => {
app.set('db', dbInstance);
// dbInstance.new_planes()
// .then( planes => console.log( planes ) )
// .catch( err => console.log( err ) );
dbInstance.get_planes()
.then( planes => console.log( planes ) )
.catch( err => console.log( err ) );
});
app.use( bodyParser.json() );
app.use( cors() );
const port = process.env.PORT || 3000
app.listen(port, () => { console.log(`Server listening on port ${port}`) } );In this step, we will use our dbInstance in a controller file instead of in index.js.
- Open
controller.js. - Use
module.exportsto export an object. - Add a
getPlanesproperty to the object that equals a function with areq,res, andnextparameter. - Get the
dbInstanceby usingreq.app.get('db'). - Using the
dbInstacecallget_planes.- Chain a
.thenwith a parameter calledplanes. Then useresto send backplanesand a status of 200. - Chain a
.catchwith a parameter callederr. Console log theerrand useresto send a status 500.
- Chain a
- Open
index.js. - Require
controller.js. - Create a
GETendpoint on/api/planes/that callscontroller.getPlanes. - In your index.js file, comment out dbInstance.get_planes as this is now setup in the controller.
controller.js
module.exports = {
getPlanes: ( req, res, next ) => {
const dbInstance = req.app.get('db');
dbInstance.get_planes()
.then(planes => { res.status(200).send(planes); })
.catch( err => {
console.log(err);
res.status(500).send(err);
});
}
}; index.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const massive = require('massive');
require('dotenv').config()
const controller = require('./controller');
const app = express();
massive( process.env.CONNECTION_STRING ).then( dbInstance => {
app.set('db', dbInstance);
// dbInstance.new_planes()
// .then( planes => console.log( planes ) )
// .catch( err => console.log( err ) );
//dbInstance.get_planes()
// .then( planes => console.log( planes ) )
// .catch( err => console.log( err ) );
});
app.use( bodyParser.json() );
app.use( cors() );
app.get('/api/planes', controller.getPlanes);
const port = process.env.PORT || 3000
app.listen(port, () => { console.log(`Server listening on port ${port}`) } );In this step, we'll modify the get_planes SQL file to use a parameter.
- Open
get_planes.sql. - At the end of the first line, add
WHERE PassengerCount > $1; - Open
controller.js. - Pass in an array as the first parameter for
dbInstance.get_planes.- Use number
25as the first element of the array.
- Use number
get_planes.sql
SELECT * FROM airplanes WHERE PassengerCount > $1; controller.js
module.exports = {
getPlanes: ( req, res, next ) => {
const dbInstance = req.app.get('db');
dbInstance.get_planes([25])
.then(planes => { res.status(200).send(planes); })
.catch( err => {
console.log(err);
res.status(500).send(err);
});
}
};If you see a problem or a typo, please fork, make the necessary changes, and create a pull request so we can review your changes and merge them into the master repo and branch.
© DevMountain LLC, 2017. Unauthorized use and/or duplication of this material without express and written permission from DevMountain, LLC is strictly prohibited. Excerpts and links may be used, provided that full and clear credit is given to DevMountain with appropriate and specific direction to the original content.
