在nodejs应用程序中传递数据库连接

时间:2014-09-04 16:01:14

标签: database node.js

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

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

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


我使用快速生成器来创建一个骨架应用程序。 在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');
});

2 个答案:

答案 0 :(得分:16)

我只是在应用程序中保留数据库连接:

app.set('db',new MyDAO(config));< - 用于定义路线的位置。

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

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

这样,您可以将数据库连接池连接到gloabl应用程序上下文。

替代的常见方法是在每个请求上扩展req,但每次都会执行:

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

答案 1 :(得分:0)

流行的答案对我不起作用,因为我使用了 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()
...