javascript - 在其他 Node javascript 文件中重用 postgresql 池

标签 javascript node.js postgresql express pool

我正在使用 postgresql 数据库创建 nodejs 后端应用程序。我想要的是一旦我在我的 db.js 文件中创建到数据库的连接,我就可以在其他文件中重用它来执行查询。

这是我的 db.js 文件

const pool = new Pool({
    user: 'us',
    host: 'localhost',
    database: 'db',
    password: 'pass',
    port: 5432,
})
pool.on('connect', () => {
    console.log('connected to the Database');
});
module.exports = () => { return pool; }

这就是我尝试在 index.js 文件中使用它的方式

const db = require('./db.js')

app.get('/', (request, response) => {

    db().query('SELECT * FROM country'), (error, results) => {
        if (error) {
            response.send(error)
        }
        console.log(results)
        response.status(201).send(results)
    }
})

没有任何错误,当我转到这个特定页面时,它一直在加载。控制台中也没有任何内容。

但是,如果我在我的 db.js 文件中编写一个函数并执行类似 pool.query(...) 的操作,将其导出,然后在我的 index.js 中编写 app.get('/', exportedFunction),一切正常。

有没有什么办法可以不把我所有的(比如 50 个)查询都写在一个 (db.js) 文件中,因为我想稍微组织一下我的项目?

最佳答案

要完全简化您的项目结构,如果您是从头开始,可以试试这个:

index.js

const express = require('express');
const app = express();

const PORT = 8080;
const bodyparser = require('body-parser');
const baseRouter = require('../your-router');

app.use(bodyparser.json());
app.use(express.json());
app.use('/', baseRouter);

app.listen(PORT, function () {
console.log('Server is running on PORT:', PORT);
}); 

your-router.js

const Router = require('express');
const router = Router();
const getCountries = require('../handlers/get');

router.get('/check-live', (req, res) => res.sendStatus(200));
// route for getCountries
router.get('/countries', getCountries);

src/handler/get.js

const YourService = require('./service/your-service');

function getCountries(request, response) {
    const yourService = new YourService();
    yourService.getCountries(request)
        .then((res) => { response.send(res); })
        .catch((error) => { response.status(400).send({ message: error.message }) })
}

module.exports = getCountries;

src/service/your-service.js

const connectionPool = require('../util/dbConnect');
class yourService {

    getCountries(req) {
        return new Promise(((resolve, reject) => {
            connectionPool.connect((err, db) => {
                if (err) reject(err);
                let query = format('SELECT * FROM country'); // get inputs from req
                db.query(query, (err, result) => {
                    if (err) reject(err);
                    resolve(result);
                })
            });
        }));
    }
}

module.exports = yourService;

dbConnect.js

const pgCon = require('pg')
const PGUSER = 'USER'
const PGDATABASE = 'localhost'
let config = {
    user: PGUSER,
    database: PGDATABASE,
    max: 10,
    idleTimeoutMillis: 30000
}

let connectionPool = new pgCon.Pool(config);

module.exports = connectionPool;

请将此视为一个基本示例,重构您的代码以使用回调/异步等待(在上面的示例中,您可以只使用不需要转换为 promise 的回调),如果需要 - 您可以从服务层,以便从服务层提取数据库方法。

关于javascript - 在其他 Node javascript 文件中重用 postgresql 池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149334/

相关文章:

node.js - 如果我使用 HTTPS,是否需要 OAuth?

postgresql - QSqlQuery Postgres 多选

javascript - 谷歌地图 : Why does MarkerClusterer not work?

php - Onclick 事件不起作用,Onmouse 事件却起作用

Javascript 为每个 if 而不是多个 if

node.js - passport-google-oauth 无法注销用户

javascript - 如何使用 Python 和 Selenium 获取链接的 onclick "action"?

javascript - 使用 Express 中的 i18n-2 创建多语言 Web 应用程序

postgresql - 更新后使用触发器更新表

sql - postgresql 9.2中,分区可以使用hint优化吗?