Я пытался создать быстрое приложение nodeJS, которое позволяет мне быстро размещать некоторые данные электронной таблицы в базе данных PSQL. У меня никогда не было проблем с этим раньше, когда я ранее использовал базу данных PSQL с приложением nodeJS.
Однако в настоящее время у меня возникла проблема, заключающаяся в том, что при выполнении запроса INSERT INTO я не получаю ни ошибки, ни каких-либо новых данных, фактически загруженных в мою базу данных. Я использовал console.info() на стороне nodeJS, чтобы показать, что маршрут POST действительно вызывается и получает правильные данные. Я также смог показать, что запрос, который он намеревается отправить, верен (я скопировал запросы, которые приложение nodeJS создает, в pgAdmin, чтобы показать, что оно работает по назначению).
Тем не менее, у меня нет ошибок или каких-либо данных в моей базе данных? У меня есть небольшой фрагмент моего кода, имеющий прямое отношение к маршруту POST ниже:
app.post('/', req => {
var query = `INSERT INTO timeperception (timestamp, age, gender, hourssince, emotion, tempo,
hue, time_perception) VALUES (${req.body.timestamp}, ${req.body.age},
'${req.body.gender}', ${req.body.hoursSince}, ${req.body.emotion},
${req.body.tempo}, ${req.body.hue}, 12)`;
console.info(query); // confirms to me that query is correct
client.query(query, err => {
if (err) console.info(err.message); // is meant to produce error if query fails
});
});
А вот код, в котором я устанавливаю свое первоначальное соединение с базой данных:
const { Client } = require('pg')
const client = new Client({
connectionString: process.env.CONNECTION_STRING || process.env.DATABASE_URL,
ssl: true,
sslmode: require
})
client.connect();
Любая помощь будет очень признательна.
Да, я сделал это быстро, и только у меня есть доступ к веб-приложению и базе данных, поэтому я пока не особо беспокоился о защите от атак с использованием инъекций. Я полагаю, мне нужно использовать await / async, чтобы дождаться подключения клиента? Я не уверен, как правильно использовать эти функции, и всегда сталкиваюсь с какой-то ошибкой из-за того, что все должно быть в асинхронной функции. Почему мне не пришлось учитывать ожидание подключения в предыдущих примерах, что-то меняли недавно?
Я не уверен, что у node-postgres есть внутренний механизм буфера запросов, который удерживает запросы до времени соединения, но даже если это так, всегда есть вероятность, что ваш код действительно не может подключиться каким-либо образом - вы не узнаете пока ты не проверишь. Кроме того, попробуйте записать что-нибудь для успешного сценария.
Я не вижу ничего, что фиксирует транзакцию.
@AdrianKlaver Вы имеете в виду, что ничего не видите, что делает запрос INSERT INTO? Я считаю, что это должен сделать первый блок кода в моем вопросе.
Я имею в виду, что для того, чтобы последствия транзакции сохранялись, необходимо выпустить COMMIT;. Некоторые клиенты делают это с режимом AUTOCOMMIT по умолчанию после каждого оператора, в противном случае пользователь / код должен выдать явный COMMIT; для сохранения эффектов оператора.





Я обнаружил, что мне нужно использовать Pool вместо Client для моей цели, чтобы соединение с базой данных оставалось постоянно открытым для INSERT INTO в любой момент. Для этого мой код для двух приведенных выше блоков пришлось изменить следующим образом:
app.post('/', req => {
var query = `...`; // place your actual query here instead of '...'
pool.query(query, err => {
if (err) console.info(err.message);
});
});
const { Pool, Client } = require('pg')
const pool = new Pool({
connectionString: process.env.CONNECTION_STRING || process.env.DATABASE_URL,
ssl: { rejectUnauthorized: false }, // this line is important for using Pool
sslmode: require
})
client.connect();
1. Вы не ждете подключения клиента. 2. Код уязвим для тривиальной атаки с использованием SQL-инъекции, и его не следует использовать таким образом. См. node-postgres.com/features/queries - раздел «Параметризованный запрос».