【问题标题】:Passing database connection around in a nodejs application在 nodejs 应用程序中传递数据库连接
【发布时间】:2014-09-04 16:01:13
【问题描述】:

我在我的节点应用程序中使用 express 3,并且我已将我的路由分成单独的文件...

app.use('/', routes);
app.use('/users', users);

问题是我在许多这些路由中都需要一个数据库连接。我应该在每个路由文件中连接到数据库,还是可以在我的主应用程序文件中连接并以某种方式将连接传递给包含?


我使用 express-generator 创建了一个骨架应用程序。 在 app.js 中,路由是这样包含的...

app.use('/', routes);
app.use('/users', users);

在这些文件中,它们之间的路由如下...

var express = require('express');
var router = express.Router();

router.get('/', function(req, res) {
    res.render('index');
});

【问题讨论】:

标签: database node.js


【解决方案1】:

我只是在应用中保持数据库连接:

app.set('db',new MyDAO(config));

然后,在路线内,get()post() 我只是这样做

req.app.get('db').usercollection.find()

这样您就可以将数据库连接池附加到全局应用程序上下文。

另一种常用方法是在每个请求上扩展req,但每次都执行:

app.use(function(req,res,next){
    req.db = db; //this db comes from app.js context where you define it
    next();
});

【讨论】:

  • 什么是新的MyDAO(config)?如果我使用和尚,并且var db=require('monk')('localhost/dbname'); 会是一样的吗?我的意思是我正在做的事情,只是不确定它是否和你描述的一样。
  • 是的。 Monk 是 Mongo 的一种通用数据访问对象 (DAO)。 MyDAO 这里只是一个围绕后端的抽象,以可读和可维护的方式检索和存储对象。它通常具有getUserById()getTodaysBlogEntries()addChatMessage() 或类似的业务逻辑特定方法。如果你把后端从 MySQL 改成 Mongo,就不用改上层的代码,直接替换 DAO 就可以了。参见例如en.wikipedia.org/wiki/Data_access_object
  • 太棒了!拯救我的一天!
【解决方案2】:

普遍的答案对我不起作用,因为我使用了typescript-express-starter 项目,它将数据库功能从controller 级别到services 级别的项目中更深一层。除了对每个服务调用都使用 service.call(req.app.get('db'), deleteParams) 之外,还必须有另一种策略。

我只是使用静态db.ts 文件来声明和初始化数据库值:

import { Knex } from 'knex';

const db: Knex = require('knex')({
  // debug only in development
  // this will cause knex to print extra helpful lines in the console
  debug: process.env.NODE_ENV === 'development',
  client: 'pg',
  version: '13.2',
  connection: {
    host: process.env.RDS_HOSTNAME,
    user: process.env.RDS_USERNAME,
    password: process.env.RDS_PASSWORD,
    database: process.env.RDS_DB_NAME,
  },
});

// perform a test query to verify the connection to the DB was successful
db.select('*')
  .from('auth_group')
  .then(rows => {
    console.log(rows);
  });

export default db;

然后在我刚才直接导入的服务级代码中:

import db from '../db';
...
db.select()
...

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 2015-10-23
    • 2014-04-04
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2016-02-02
    • 2011-12-04
    相关资源
    最近更新 更多