我在我的节点应用程序中使用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');
});
答案 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()
...