Имеется вот такая логика работы с базой данных. Хотел реализовать так. Отправил с клиента на сервер данные, с сервера записал в бд используя транзакцию,создал событие которое делает 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; //событие для отправки на клиент данных, через запрос к бд.
}));
Ответ был прост)
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());
});
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня сайт на laravelПомогите разобраться с установкой этих пакетов
Скинули скрипт, но без комментариев не понятно как он работаетПросьба сделать комментарии
Как в javascript установить элемент input type=radio как отмеченный, либо убрать отметку и получить - является ли элемент зачеканным в данный момент?
Из массива 0 и 1, получаю массив чисел (числа равны количеству 0 и 1)Не могу понять, как получить обратно массивы 0 и 1?