Я разрабатываю полный API для отдыха с узлом и exrpess, моя база данных - postgresql, мне нужно использовать pg-promise пакета postgres.
Я знаю, что мне нужно связать свое приложение с базой данных в файле app.js, но мой вопрос в том, как мне использовать это соединение в моих конечных точках.
У меня есть маршруты, и я использую контроллеры.
Например
app.js
//in this file, suppously I have to to the connection
const db = pgp('postgres://john:pass123@localhost:5432/products');
app.use('/products', productsRoute);
products.js (маршрут)
router.get('/', ProductsController.get_all_products);
products.js (контроллер)
exports.get_all_products = (req, res, next ) => {
// Here i want to use de database connection to do the query to find all
//products in the database
}
Как мне получить доступ к соединению, чтобы сделать что-то вроде
db.any('SELECT * FROM products WHERE active = $1', [true])
.then(function(data) {
// success;
})
.catch(function(error) {
// error;
});
От контроллера.
Обновлять
Хорошо, теперь я использую node-prostgres, pg. Я видел лучше, Спасибо за совет люди.
Я хочу создать один раз экземпляр de db и вызвать его где угодно, в частности, в контроллерах.
Могу ли я использовать app.local для сохранения моего клиента? Подключиться, выполнить запрос и затем закрыть его. Делайте это где угодно





Я не использовал pg-promise.
Если это поможет, вы можете использовать Клиент PostgreSQL для Node.js. Вы также можете использовать async/await с ним.
Вместо маршрутизатора вы можете сразу использовать промежуточное ПО Express следующим образом.
//app.js:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const port = 1234
const db = require('./dbconnector')
//...omitted for brevity`
// 'db' is exported from a file such as
// dbconnector.js.
app.get('/products', db.getProducts)
//In dbconnector.js:
const Pool = require('pg').Pool
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'mydb',
password: 'mypwd',
port: 5432,
})
const getProducts = (request, response) => {
pool.query('SELECT * FROM products ORDER BY id
ASC', (error, results) => {
if (error) {
throw error
}
response.status(200).json(results.rows)
})
}
// ...omitted for brevity
module.exports = {
getProducts
}
Для модульной конструкции, пожалуйста, используйте отдельный файл (не app.js/index.js/server.js) для соединений с базой данных в качестве наилучшей практики и require в вашем основном файле app.js.
Вот помощь на модуле pg.
Используйте отдельный файл, такой как dbconnector.js, для обработки подключений к базе данных, а не для обработки подключений, ошибок в основном файле (app.js).
Вот пример того, как его использовать:
// mydb.js
async function someDbQuery() {
let result;
try {
result = db.any('SELECT * FROM products WHERE active = $1', [true])
} catch (e) {
throw e
}
return result;
}
module.exports = someDbQuery;
// in your controller after importing
const { someDbQuery } = require('./mydb.js')
exports.get_all_products = async (req, res, next ) => {
// Here i want to use de database connection to do the query to find all
//products in the database
try {
const result = await someDbQuery();
// use result here
} catch (e) {
// handle error
console.error(e)
}
}
Примечание:
Из документов pg-promise
Built on top of node-postgres
node-postgres теперь также поддерживает обещания.
Вам не нужно ничего делать, pg-promise автоматически управляет соединениями. Он будет выделен для запроса и сразу после этого освобожден. См. Примеры.
Не могли бы вы объяснить мне это, пожалуйста
please use a separate file (not app.js/index.js/server.js)