【问题标题】:using postgres with nodejs for connection pool使用带有nodejs的postgres作为连接池
【发布时间】:2018-01-22 21:19:10
【问题描述】:

我使用 nodejs 作为我的 REST api 主机。整体功能非常基本。也就是说,进行 REST 调用,该调用应该执行 postgres db 查询并返回数据。我遇到的问题是整体代码组织。

我有具有基本初始化的 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));
        });
    }

};

【问题讨论】:

  • 看起来不错,如果你想有更短的代码,你可能想试试node-postgres.com
  • 在我的情况下,pool.connect 中的应用程序没有解析,因为它在 server.js 中定义
  • 哦,等一下,你已经在使用 node-postgres 了。请问您为什么将应用程序放入池中。您已经让应用程序在 server.js 上侦听
  • 好吧,我从 2 个不同的位置复制粘贴的代码,而且我对 nodejs 非常陌生。所以不知道怎么解决
  • pg-promise-demo 为您可以找到用于pg-promise 的数据库提供最佳代码结构。

标签: node.js node-postgres


【解决方案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

【讨论】:

  • 如何在路由器中的多个路由文件之间共享池?我在 ./routes 目录中为每个端点都有一个单独的文件,并且需要在应用程序的一个位置实例化池并将其公开给所有路由。在koa中我可以将连接池实例粘贴在ctx.pool上,是否可以使用express?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多