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));
});
}
};
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.