INSERT INTO запросы к серверу PSQL ничего не делают

Я пытался создать быстрое приложение 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();

Любая помощь будет очень признательна.

1. Вы не ждете подключения клиента. 2. Код уязвим для тривиальной атаки с использованием SQL-инъекции, и его не следует использовать таким образом. См. node-postgres.com/features/queries - раздел «Параметризованный запрос».

Robert Kawecki 31.03.2021 17:46

Да, я сделал это быстро, и только у меня есть доступ к веб-приложению и базе данных, поэтому я пока не особо беспокоился о защите от атак с использованием инъекций. Я полагаю, мне нужно использовать await / async, чтобы дождаться подключения клиента? Я не уверен, как правильно использовать эти функции, и всегда сталкиваюсь с какой-то ошибкой из-за того, что все должно быть в асинхронной функции. Почему мне не пришлось учитывать ожидание подключения в предыдущих примерах, что-то меняли недавно?

James 31.03.2021 17:50

Я не уверен, что у node-postgres есть внутренний механизм буфера запросов, который удерживает запросы до времени соединения, но даже если это так, всегда есть вероятность, что ваш код действительно не может подключиться каким-либо образом - вы не узнаете пока ты не проверишь. Кроме того, попробуйте записать что-нибудь для успешного сценария.

Robert Kawecki 31.03.2021 17:57

Я не вижу ничего, что фиксирует транзакцию.

Adrian Klaver 31.03.2021 18:46

@AdrianKlaver Вы имеете в виду, что ничего не видите, что делает запрос INSERT INTO? Я считаю, что это должен сделать первый блок кода в моем вопросе.

James 31.03.2021 19:10

Я имею в виду, что для того, чтобы последствия транзакции сохранялись, необходимо выпустить COMMIT;. Некоторые клиенты делают это с режимом AUTOCOMMIT по умолчанию после каждого оператора, в противном случае пользователь / код должен выдать явный COMMIT; для сохранения эффектов оператора.

Adrian Klaver 31.03.2021 21:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
28
1

Ответы 1

Я обнаружил, что мне нужно использовать 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();

Другие вопросы по теме