using postgres with nodejs for connection pool

Vik picture Vik · Jun 20, 2017 · Viewed 14.2k times · Source

i am using nodejs as my REST api host. The overall functionality is pretty basic. that is, make a REST call which should do a postgres db query and return data. The problem I am having is the overall code organization.

I have the server.js which has basic initialization. Now, where should i place the postgres connection and call it to query db whenever i need it. current structure is as below. so i think i should be moving the postgres connect code to server.js? what should be the right structure

server.js

"use strict";

 var express = require('express'),
  app = express(),
  port = process.env.PORT || 4001,
  bodyParser = require('body-parser');

  app.use(bodyParser.urlencoded({ extended: true }));
  app.use(bodyParser.json());
  app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', '*')
    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);
    // Pass to next layer of middleware
    next();
});
var routes = require('./api/routes/pushRoutes');
routes(app);

app.listen(port);
console.log('push notification server started on: ' + port);

pushController.js

'use strict';

exports.send_notification = function(req, res) {
    console.log("start of send_notification ");

     if (req.method == 'POST') {
        var jsonString = '';

        req.on('data', function (data) {
            jsonString += data;
        });

        req.on('end', function () {
            console.log(JSON.parse(jsonString));
            var json = JSON.parse(jsonString);
            var timeNow = json.message;

            //get device token from db
            var deviceToken = '';
            var pg = require('pg')
            var format = require('pg-format')
            var PGUSER = 'deploy'
            var PGDATABASE = 'oscpushserver'
            var config = {
              user: PGUSER, // name of the user account
              database: PGDATABASE, // name of the database
              max: 10, // max number of clients in the pool
              idleTimeoutMillis: 30000 
            }

            var pool = new pg.Pool(config)
            var myClient

            pool.connect(function (err, client, done) {
              if (err) console.log(err)
              app.listen(3000, function () {
                console.log('listening on 3000')
              })
              myClient = client
              var ageQuery = format('SELECT * from push_table WHERE seq_id = 1')
              myClient.query(ageQuery, function (err, result) {
                if (err) {
                  console.log(err)
                }
                console.log("row data:" + result.rows[0])
                console.log("device id from db:" + result.rows[0].device_id)
                deviceToken =result.rows[0].device_id;


              })
            });


            res.json(JSON.parse(jsonString));
        });
    }

};

Answer

Mμ. picture Mμ. · Jun 20, 2017

I assume that you want to make a REST api that just gets data from db.

server.js

Looks fine in most parts, except that you are not using the routes correctly. To use the routes you have defined you use app.use:

app.use('/', routes);

database.js I would create another file where you can put the database credentials in one place and create a new pool.

var pg = require('pg')
var PGUSER = 'deploy'
var PGDATABASE = 'oscpushserver'
var config = {
  user: PGUSER, // name of the user account
  database: PGDATABASE, // name of the database
  max: 10, // max number of clients in the pool
  idleTimeoutMillis: 30000 
}

var pool = new pg.Pool(config);

module.exports = pool;

pushController

I assume that you want to require this file in server.js. So make sure that the path points to '.../pushController' and not './api/routes/pushRoutes'.

const express = require('express');
const router = express.Router();
const format = require('pg-format');
const pool = require('../path/to/database.js');

router.get(function(req, res, next) {
  pool.connect(function (err, client, done) {
    if (err) throw new Error(err);
    var ageQuery = format('SELECT * from push_table WHERE seq_id = 1')
    client.query(ageQuery, function (err, result) {
      if (err) throw new Error(err);
      res.json(result.rows[0]); 
    })
  }); 
});

module.exports = router;

So now, a GET request to your API server should return a json object from your postgres database.

There are loads of examples online on how to make REST APIs with node and postgres. One of them is this: https://github.com/mjhea0/node-postgres-todo.