在其他节点 javascript 文件中重用 postgresql 池
Reusing postgresql pool in other node javascript files
我正在使用 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;
请将此视为一个基本示例,重构您的代码以使用 callbacks/async 等待(在上面的示例中,您可以只使用不需要转换为承诺的回调),如果需要 - 您可以 DB-layer 从服务层调用,以便从服务层提取 DB 方法。
我正在使用 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;
请将此视为一个基本示例,重构您的代码以使用 callbacks/async 等待(在上面的示例中,您可以只使用不需要转换为承诺的回调),如果需要 - 您可以 DB-layer 从服务层调用,以便从服务层提取 DB 方法。