在其他节点 javascript 文件中重用 postgresql 池

lex*_*_sa 5 javascript postgresql pool node.js express

我正在使用 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; }
Run Code Online (Sandbox Code Playgroud)

这就是我尝试在 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)
    }
})
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法不将所有(例如 50 个)查询写入一个(db.js)文件中,因为我想稍微组织一下我的项目?

sri*_*asy 3

要完全简化您的项目结构,如果您从头开始,可以尝试以下操作:

索引.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);
}); 
Run Code Online (Sandbox Code Playgroud)

你的路由器.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);
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这很有帮助,特别是 dbConnect.js 和 your-service.js,我在其中找到了如何导出创建的池,并在另一个文件中使用它,这是我的主要问题。感谢您提供整个项目结构示例! (2认同)