28 янв. 2022 г.

Зависание nodejs при запуске через окно терминала Windows

Есть неприятная особенность в окне терминала Windows. Если включен режим Quick Edit (Быстрая вставка или Быстрое редактирование в русскоязычной версии интерфейса), то в определенный момент терминал может перейти в режим ожидания клавиатурного ввода от пользователя. Выйти из этого режима можно нажав любую клавишу, но пока это не будет сделано, сервер node будет висеть и не отвечать на запросы по сети.

У данной проблемы есть следующие решения:

  1. Отключить режим Quick edit в окне Properties терминала (см. скриншот ниже)
  2. Использовать другой терминал (например, git bash)
  3. Запускать nodejs через Task Scheduler операционной системы.
Дополнительная информация на Stack Overflow.

26 янв. 2022 г.

Шрифт MS Sans Serif для кирилической кодировки Win-1251

В некоторых случаях мы сталкивались с тем, что на разных версиях Windows, включая новейшую 11-ю версию, шрифт MS Sans Serif (© Microsoft 1992) поставлялся без кодовой таблицы Win-1251. Соответственно, в Гедымине не отображались некоторые меню, текст в таблицах и надписи в выпадающих списках. Скачайте и установите данный шрифт, если вы столкнулись с вышеуказанной проблемой.

20 янв. 2022 г.

Ровно в следующий четверг, 27 января, нам исполняется 28 лет! Традиционный боулинг, как обычно, в 19:00 в клубе Мэдисон. В ЧЕТВЕРГ! Будем рады видеть всех наших сотрудников! Как действующих, так и бывших.

🎳

Различие в поведении finally между Delphi и Javascript

Пришлось потратить пару дней в поисках трудновыявимой ошибки. Все дело в том, что finally работает в Delphi и NodeJS по-разному. Будьте осторожны.

Например, в Делфи, код в секции finally выполнится ПЕРЕД окончанием выполнения функции:

function someFunc;
var
tr: TIBTransaction; 
begin
tr := TIBTransaction.Create(); 
try
... 
finally
if tr.InTransaction then
tr.Commit;
tr.Free;  
end; 
end; 

В Javascript, код в секции finally (даже не смотря на наличие await) выполнится уже ПОСЛЕ того как результат функции будет передан получателю. 

export const upsertAccount: RequestHandler = async (req, res) => {
  const { client, attachment, transaction} = await setConnection();

  try {
...
  }
  finally {
    await closeConnection(client, attachment, transaction);
  }
}; 

Теперь представим такую ситуацию. На веб сервер посылается сначала запрос на изменение данных, а после его выполнения запрос на получение (перечитывание) данных. Если мы будем делать commit транзакции в секции finally, то возможна такая ситуация, когда первый запрос уже завершится и вернет результат на клиента, который, в свою очередь, выполнит второй запрос к серверу, а транзакция все еще будет не подтверждена. В этом случае клиент получит старые данные, не соответствующие тому, что находится в базе данных.

Выход в данном случае или комитить транзакцию до секции finally, или использовать мьютекс на несколько обработчиков, который не даст прочитать данные, пока не запишется транзакция, которая меняла эти данные.