Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在node.js web应用程序中全局定义PostgreSQL数据库连接变量是最佳实践吗?

在node.js web应用程序中全局定义PostgreSQL数据库连接变量是最佳实践吗?
EN

Stack Overflow用户
提问于 2018-05-28 06:20:57
回答 2查看 958关注 0票数 2

我正在创建一个带有PostgreSQL数据库的节点和快速REST应用程序。

我的问题是如何在极简主义的express应用程序中全局定义连接变量(对于Hello World示例)?

我有以下文件结构,其中包含以下关键文件。

  • {PROJECT_ROOT}\bin\www
  • {PROJECT_ROOT}\app.js
  • {PROJECT_ROOT}\routes\index.js
  • {PROJECT_ROOT}\db\db.js
  • {PROJECT_ROOT}\db\location.js
  • {PROJECT_ROOT}\OTHER文件

db.js应包含用于全局连接PostgreSQL数据库的变量的定义。这个变量应该在必要时由其他模块共享,以避免重复的连接。

db.js

代码语言:javascript
运行
AI代码解释
复制
var promise = require('bluebird');

/**
 *Use dotenv to read .env vars into Node
 */
require('dotenv').config();

const  options = {
  // Initialization Options
  promiseLib: promise,
  connect(client, dc, useCount) {
    const cp = client.connectionParameters;
    console.log('Connected to database:', cp.database);
  }
};

const  pgp = require('pg-promise')(options);
const  connectionString = process.env.PG_CONN_STR;
const  db = pgp(connectionString);

module.exports = {
    pgp, db
};

location.js定义了操作gcur_point_location表的业务逻辑。

代码语言:javascript
运行
AI代码解释
复制
var db_global = require('./db');
var db = db_global.db;

// add query functions

module.exports = {
  getAllLocations: getAllLocations,
  getLocation: getLocation,
  createLocation: createLocation,
  updateLocation: updateLocation,
  removeLocation: removeLocation
};

function getAllLocations(req, res, next) {
  db.any('select * from gcur_point_location')
    .then(function (data) {
      res.status(200)
        .json({
          status: 'success',
          data: data,
          message: 'Retrieved ALL GCUR Point Locations'
        });
    })
    .catch(function (err) {
      return next(err);
    });
}

function getLocation(req, res, next) {
  var locationId = parseInt(req.params.id);
  db.one('select * from gcur_point_location where locationid = $1', locationId)
    .then(function (data) {
      res.status(200)
        .json({
          status: 'success',
          data: data,
          message: 'Retrieved ONE Location by Id'
        });
    })
    .catch(function (err) {
      return next(err);
    });
}

function createLocation(req, res, next) {
  req.body.age = parseInt(req.body.age);
  db.none('insert into gcur_point_location(locationname, locationstatus, lng, lat)' +
      'values(${locationname}, ${locationstatus}, ${lng}, ${lat})',
    req.body)
    .then(function () {
      res.status(200)
        .json({
          status: 'success',
          message: 'Inserted one Location'
        });
    })
    .catch(function (err) {
      return next(err);
    });
}

function updateLocation(req, res, next) {
  db.none('update gcur_point_location set locationname=$1, locationstatus=$2, lng=$3, lat=$4 where locationid=$5',
    [req.body.locationname, req.body.locationstatus, parseFloat(req.body.lng),
      parseFloat(req.body.lat), parseInt(req.params.id)])
    .then(function () {
      res.status(200)
        .json({
          status: 'success',
          message: 'Updated Location'
        });
    })
    .catch(function (err) {
      return next(err);
    });
}

function removeLocation(req, res, next) {
  var locationId = parseInt(req.params.id);
  db.result('delete from gcur_point_location where locationid=$1', locationId)
    .then(function (result) {
      /* jshint ignore:start */
      res.status(200)
        .json({
          status: 'success',
          message: `Removed ${result.rowCount} Location`
        });
      /* jshint ignore:end */
    })
    .catch(function (err) {
      return next(err);
    });
}

同样,不同表的控制将在单独的js文件中定义。所有这些都需要db.js。

routes/index.js

代码语言:javascript
运行
AI代码解释
复制
var express = require('express');
var router = express.Router();

var db = require('../db/location');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/api/locations', db.getAllLocations);
router.get('/api/location/:id', db.getLocation);
router.post('/api/location', db.createLocation);
router.put('/api/location/:id', db.updateLocation);
router.delete('/api/location/:id', db.removeLocation);

module.exports = router;

app.js

代码语言:javascript
运行
AI代码解释
复制
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

我想知道上面的代码是一个好的实践还是坏的实践,或者是任何潜在的失败?

EN

回答 2

Stack Overflow用户

发布于 2018-05-28 06:28:51

大部分代码对我来说都是有意义的,尽管我会实现您自己的ORM和模型层,因此您可以删除一些用于PSQL查询的代码,并遵循MVC设计模式。如果您正在构建的所有内容都是一个express api服务器,那么您就不需要View部分。

我通常有一个名为ORM的文件,其内容类似于以下内容:

代码语言:javascript
运行
AI代码解释
复制
var orm = {
  all: function(tableInput, cb) {
    var queryString = "SELECT * FROM " + tableInput + ";";
    connection.query(queryString, function(err, result) {
      if (err) {
        throw err;
      }
      cb(result);
    });
  },
  create: function(table, cols, vals, cb) {
    var queryString = "INSERT INTO " + table;

    queryString += " (";
    queryString += cols.toString();
    queryString += ") ";
    queryString += "VALUES (";
    queryString += printQuestionMarks(vals.length);
    queryString += ") ";

    console.log(queryString);

    connection.query(queryString, vals, function(err, result) {
      if (err) {
        throw err;
      }

      cb(result);
    });
  },
  // An example of objColVals would be {name: panther, sleepy: true}
  update: function(table, objColVals, condition, cb) {
    var queryString = "UPDATE " + table;

    queryString += " SET ";
    queryString += objToSql(objColVals);
    queryString += " WHERE ";
    queryString += condition;

    console.log(queryString);
    connection.query(queryString, function(err, result) {
      if (err) {
        throw err;
      }

      cb(result);
    });
  }
};

// Export the orm object for the model (cat.js).
module.exports = orm;

然后,我为psql中的每个表定义一个模型文件,如下所示:

代码语言:javascript
运行
AI代码解释
复制
// Import the ORM to create functions that will interact with the database.
var orm = require("../config/orm.js");

var cat = {
  all: function(cb) {
    orm.all("cats", function(res) {
      cb(res);
    });
  },
  // The variables cols and vals are arrays.
  create: function(cols, vals, cb) {
    orm.create("cats", cols, vals, function(res) {
      cb(res);
    });
  },
  update: function(objColVals, condition, cb) {
    orm.update("cats", objColVals, condition, function(res) {
      cb(res);
    });
  }
};

// Export the database functions for the controller (catsController.js).
module.exports = cat;

控制器:

代码语言:javascript
运行
AI代码解释
复制
var express = require("express");

var router = express.Router();

// Import the model (cat.js) to use its database functions.
var cat = require("../models/cat.js");

// Create all our routes and set up logic within those routes where required.
router.get("/", function(req, res) {
  cat.all(function(data) {
    var hbsObject = {
      cats: data
    };
    console.log(hbsObject);
    res.render("index", hbsObject);
  });
});

router.post("/api/cats", function(req, res) {
  cat.create(["name", "sleepy"], [req.body.name, req.body.sleepy], function(result) {
    // Send back the ID of the new quote
    res.json({ id: result.insertId });
  });
});

router.put("/api/cats/:id", function(req, res) {
  var condition = "id = " + req.params.id;

  console.log("condition", condition);

  cat.update(
    {
      sleepy: req.body.sleepy
    },
    condition,
    function(result) {
      if (result.changedRows === 0) {
        // If no rows were changed, then the ID must not exist, so 404
        return res.status(404).end();
      }
      res.status(200).end();

    }
  );
});

// Export routes for server.js to use.
module.exports = router;

这遵循MVC设计模式,非常容易阅读和理解。所以我的整个文件夹结构应该是这样的:

票数 0
EN

Stack Overflow用户

发布于 2018-05-28 10:30:50

pg-promise-demo中显示了使用pg-promise构建数据库层的最佳实践。

有关使用该方法的完整、真实的示例,请参阅LISK database layer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50560246

复制
相关文章
java中的局部变量和全局变量哪个优先_java中成员变量是全局变量吗
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171760.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/24
1.3K0
Node.js 服务连接 MongoDB 处理最佳实践
关于如何处理 node.js 服务连接 MongoDB,我查阅了大量中英文资料,发现并没有太适合我所期望的能力的方案,因此经过一番官方文档的研究,总结了以下的连接 MongoDB 的方法(使用目前 Node.js 平台最常用的 MongoDB ODM mongoose),斗胆称之为『最佳实践』,希望能够抛砖引玉,得到大家更专业的解答。 话不多说,先上代码:
逆葵
2019/04/25
3.5K0
html js 全局 变量,JS定义全局变量
在高级开发语言(如c#、Java)中可以很方便地使用“public”等关键字,定义应用程序中的全局变量,但JaVascript的变量只能存在于当前的方法中。本例通过一个简单的方法实现全局变量的定义。
全栈程序员站长
2022/09/06
15.8K0
html js 全局 变量,JS定义全局变量
Postgresql vacuum最佳实践
Postgresql作为世界上最先进的HTAP数据库,以其超高在线事务处理及分析性能和强大的功能被广泛应用与各行各业中。但其实它也并不完美,说到postgres,不得不提那个让人一直头疼的问题,也是数据库使用者所诟病最多的地方:vacuum。那么为什么会有vacuum这个东西呢?它是做什么用的呢?
数据库架构之美
2019/12/18
1.9K0
taro中定义以及使用全局变量
错误的姿势 // app.tsx文件中 class App extends Component { componentDidMount() { this.user = { name: '张三', id: 1 }; } } // index.tsx 文件中 const app = Taro.getApp(); export default class Index extends Component { componentWillMount() { console.log(ap
用户1437675
2019/06/11
5.7K0
七大Web应用程序安全最佳实践
2020年,CVE Details的数据显示,平均每天发现50个新的漏洞。因此,采取防护措施保护Web应用程序对企业安全的至关重要。本文将探索七种最佳实践给予Web应用程序最安全的保护。
Anita
2021/10/27
1.3K0
七大Web应用程序安全最佳实践
MySQL 定义变量 – 局部 – 全局
注意哦:这个局部变量是Session回话级别的,关闭本次回话,也就是在你Navicat关闭”新建查询”变量就会消失了。
收心
2023/03/27
2.6K0
MySQL 定义变量 – 局部 – 全局
JS 定义全局变量[通俗易懂]
需注意的是该句不能包含在function内,否则是局部变量。这是第一种方式声明全局变量。
全栈程序员站长
2022/08/31
10.4K0
Java设置全局变量_java如何定义全局变量
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171767.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/24
3K0
java全局变量的定义和声明_定义全局变量的方法
JAVA全局变量(或称成员变量)可分两种,一种是静态变量,另一种是实例变量,即在类体中定义的变量,有三点得注意: 一、成员变量不能在类体中先声明(定义)后赋值,但静态变量可以先在类体中声明,然后在方法中赋值(当然实例变量是不行的);
全栈程序员站长
2022/09/24
6.4K0
qml全局变量定义建议
  定义qml变量相当于定义JavaScript变量。JavaScript变量命名必须以字母,_,$为开头。其他字符可以是字母,_,$,数字。
Qt君
2020/02/10
3K1
Salesforce全局搜索的最佳实践
你是否想在庞大的Salesforce系统数据中搜索到客户,销售订单以及其它用户的信息,Salesforce全局搜索可以帮助你实现这一目标。
臭豆腐
2019/04/16
1.5K0
Salesforce全局搜索的最佳实践
Node.js 安全最佳实践
最近 Node.js 团队在官方文档上公布了一份最新的安全实践,解读了一些 Node.js 服务下一些常见的攻击场景以及预防手段,我们一起来看看吧!
ConardLi
2023/01/09
2.3K0
Node.js 安全最佳实践
Node.js在携程的落地和最佳实践
本文主要介绍在携程,Node.js 技术栈是如何从 0 到 1 进行技术落地的,以及在不断磨合的过程中,总结出来的最佳实践。
coder_koala
2019/12/06
7070
Node.js在携程的落地和最佳实践
PostgreSQL 自动创建分区最佳实践
分区表是 PostgreSQL 在 10 版本才具有的特性,实际使用中,用户往往需要做到提前创建分区或者按写入的数据实时创建分区。 本文探讨常见的几种自动分区创建方案。
艾超_运成
2022/02/13
4.5K0
PostgreSQL 自动创建分区最佳实践
Java如何定义全局变量_全局变量的默认值
有时一个项目中会多处涉及到路径,当你把这个项目移植到别的电脑上时就要一一修改这些路径,过程十分繁琐,所以一个全局变量在这时是必不可少的。
全栈程序员站长
2022/09/24
2.6K0
什么是全局变量,局部变量,静态全局变量,静态局部变量
这些是编程语言中的基本概念,如果你还不是非常明确地清楚标题的问题,并且不知道作用域,链接属性,存储期等概念的具体含义,那么本文你不该错过。为了更加清晰的理解我们的问题,需要先了解三个概念:作用域,链接属性,存储期。
编程珠玑
2019/07/12
2.5K0
【Node.js】全局可用变量、函数和对象
在Node.js中提供了一些全局可用的变量、函数和对象,全局就是不需要进行模块加载,可以直接使用的。其中包括全局作用域的函数和对象。也包括不在全局作用域,而在每个模块作用域都存在的变量、函数和对象,在全局可用,但不是golbal对象的属性。
颜颜yan_
2023/02/19
2.6K0
【Node.js】全局可用变量、函数和对象
Windows多个应用程序共享全局变量,静态变量
默认情况下exe不同实例使用copy-on-write技术避免共享数据,比如运行了两个exe,最开始它们使用的都是一份虚拟内存页,然后第一个实例修改了全局变量, 这时候COW就会复制那一页,然后将第一个进程地址空间对应页映射到新复制的页,第二个实例保持映射老的页。 但是如果真的需要多个实例共享数据,比如计算有多少个exe程序正在运行,就可以使用该技术。
racaljk
2018/08/31
1.2K0
loadrunner 脚本开发-定义全局变量
如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误。
授客
2019/09/12
1.2K0
loadrunner 脚本开发-定义全局变量

相似问题

在员工服务中调用Web是最佳实践吗?

12

在web应用程序中管理数据库连接的最佳实践

47

加密web.config是最佳实践吗

12

JavaScript中“全局”变量的最佳实践?

12

JavaScript最佳实践-全局变量

48
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文