Логика работы клиент-сервер-бд при insert and select запросах

119
27 июля 2019, 18:40

Имеется вот такая логика работы с базой данных. Хотел реализовать так. Отправил с клиента на сервер данные, с сервера записал в бд используя транзакцию,создал событие которое делает SELECT запрос к бд и отсылает на клиент данные. Проблема в callback не могу получить какое-то значение о успешном завершение транзакции,в итоге я получаю данные на клиенте до обновления. Если реализовать через async\wait таким образом я буду получать обновленные данные,но хотелось уменьшить запросов к бд, если к примеру то что отослал на сервер, на клиенте сразу выводить на экран. Но проблема,а если сбой на сервере,единственный вариант async/await? Правильная ли логика работы?

    var pool = require('./connect').pool;
    var promise = require('promise');

    var shouldAbort = function(err) {
    if (err) {
    console.error('Error in transaction', err.stack);
    pool.connect(function(err,client,done){
    client.query('ROLLBACK', function(err) {
        if (err) {
            console.error('Error rolling back client', err.stack);
        }
        // release the client back to the pool
        done();
    })
    })
    pool.end();
    }
    return !!err;
    }
    module.exports.insert = function DateInstert(msg,na,nameChat){
    pool.connect(function(err,client,done){
    console.log("I make insert to db");
    client.query('BEGIN', function(err) {
    if (shouldAbort(err)) return;
    client.query('INSERT INTO public.users("nickname") VALUES($1) RETURNING 
    id', [na], function(err, res) {
    if (shouldAbort(err )) return;
    var insertPhotoText = 'INSERT INTO public.chat("nameChat", user_id) 
    VALUES ($1, $2)';
    var insertPhotoValues = [nameChat,res.rows[0].id];
    var insertmsg = 'INSERT INTO public.message(user_id_send, 
    user_id_get,group_id, text) VALUES ($1, $2, $3, $4)';

    var insertValue = [4, 2, 0, msg];
    client.query(insertPhotoText, insertPhotoValues, function(err, res) {
        if (shouldAbort(err)) return;
        client.query(insertmsg, insertValue, function (err, res) {
            if (shouldAbort(err)) return;
            client.query('COMMIT', function (err) {
                if (err) {
                    console.error('Error committing transaction', err.stack)
                }
                done();
            })
        })
    })
    })
    })
    })
    }

клиент.

    $(document).on('click','button',function(){
    var message = $('input').val();
    socket.emit('message',message);
    $('input').val(null);
    });
    });

сервер

socket.on('message', async function (msg) {
    InData.insert(msg, name, "Sex"); //вставляю данные на сервер
    socket.emit('messageToclient',con.newSelect.then(function (res) {
        return res; //событие для отправки на клиент данных, через запрос к бд.
    }));
Answer 1
 Ответ был прост)

socket.on('message', async function (msg) {
          await InData.insert(msg, name, "Sex");
          socket.emit('messageToClient', await con.SelMsg());
    socket.broadcast.emit('messageToClient', await con.SelMsg());
});
READ ALSO
Установка vue и axios в laravel

Установка vue и axios в laravel

У меня сайт на laravelПомогите разобраться с установкой этих пакетов

141
Просьба написать комментарии к JS-коду [закрыт]

Просьба написать комментарии к JS-коду [закрыт]

Скинули скрипт, но без комментариев не понятно как он работаетПросьба сделать комментарии

146
Получить значение <input type=radio> элемента

Получить значение <input type=radio> элемента

Как в javascript установить элемент input type=radio как отмеченный, либо убрать отметку и получить - является ли элемент зачеканным в данный момент?

133
Как получить массивы обратно?

Как получить массивы обратно?

Из массива 0 и 1, получаю массив чисел (числа равны количеству 0 и 1)Не могу понять, как получить обратно массивы 0 и 1?

132