2017-06-20 72 views
0

我正在使用nodejs作为我的REST api主机。整体功能非常基础。也就是说,做一个REST调用,它应该执行postgres数据库查询并返回数据。我遇到的问题是整个代码组织。使用postgres和nodejs连接池

我有server.js有基本的初始化。现在,我应该在哪里放置postgres连接,并在需要时调用它来查询db。目前的结构如下。所以我认为我应该将postgres连接代码移动到server.js?什么应该是正确的结构

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

}; 
+0

看起来是正确的,如果你想要更短的代码,你可能想尝试https://node-postgres.com/ –

+0

以及pool.connect内的应用程序没有解决我的情况,因为它是在server.js – Vik

+0

哦等待我的坏你已经使用node-postgres。我可以问你为什么把应用程序放入池中。你已经有应用程序监听server.js –

回答

1

我假设你想使一个REST API,只是从数据库获取数据。

server.js

看起来大部分地区细,除了你没有正确使用的路由。要使用已定义的路由使用app.use:

app.use('/', routes); 

database.js 我会创造另一个文件,你可以把数据库凭据在一个地方,并创建一个新池。

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

我假设你想要求在server.js文件。所以请确保路径指向'.../pushController'而不是'./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; 

所以,现在,您的API服务器的GET请求应该从您的postgres数据库返回一个json对象。

有许多关于如何使用node和postgres制作REST API的示例。其中之一是:https://github.com/mjhea0/node-postgres-todo