Обновление данных в терминале (nodejs)

#javascript #node.js #express #socket.io

#javascript #node.js #экспресс #socket.io

Вопрос:

Я работаю над небольшим проектом, просто «простым»:

Пользователь может писать на терминале, например, криптовалюты :

 yarn start btc eth
  

и я отображаю массив некоторых данных (цена, изменение 24 и т. Д.), Я использую:

Я могу это сделать, теперь я хочу обновить этот массив за X секунд… но я не знаю, как это сделать:/ (Я пробовал с setInterval плохая идея, хахаха), я использую только nodejs и express для своего сервера, но я думаю, что мне нужно использовать SocketIO нет?

Комментарии:

1. Не уверен, о чем вы здесь спрашиваете? Возможно ли отображать данные в терминале и обновлять его через секунду? Да, это так.

2. да, я хочу, чтобы отображаемые данные обновлялись в одной таблице, а не воссоздавали новую таблицу каждые X секунд

Ответ №1:

Чтобы обновить данные в терминале (cli), вы должны использовать управляющие коды ANSI. Я уже некоторое время этим занимаюсь, поэтому я создал для себя небольшую информацию, чтобы отслеживать все, что вы можете с ними сделать: https://gist.github.com/dominikwilkowski/60eed2ea722183769d586c76f22098dd

Пример ниже:

 process.stdout.write('This line will be deleted');
process.stdout.write('u001b[2K'   'u001b[1G');
// u001b[2K = clear line
// u001b[1G = reset cursor to start of line
process.stdout.write('This line will replace above line');
process.stdout.write('n');
  

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

Ваш вариант использования может быть примерно таким:

 let draw = 0;
function drawTable() {
  draw   ;
  process.stdout.write(` your n table n data ${draw} n`); // prints 3 lines
}

drawTable(); // initial draw
const myInterval = setInterval(() => {
  process.stdout.write('u001b[3Au001b[1G');
  // move three rows up and reset cursor to first column
  drawTable(); // draw again
}, 1000); // redraw your table every second
  

Это увеличит ваш вывод и очистит его между розыгрышами.