nodejs - 如何将状态保持在stdout之上

时间:2014-05-24 14:04:17

标签: node.js

我正在尝试输出类似的内容:

counter is: 10            <= fixed line and auto updating
console.logs, etc...      <= other console.logs, errors, defaul outputs
console.logs, etc...
console.logs, etc...
console.logs, etc...

这可能吗?

我尝试过使用process.stdout.write()但它无效。

var counter = 0;
setInterval(function(){
    counter++;
    process.stdout.write("counter is " + counter + " \r");
}, 500);

setInterval(function(){
    console.log('some output');
}, 1500);

3 个答案:

答案 0 :(得分:7)

以下是使用blessed的示例:

var blessed = require('blessed');

var screen = blessed.screen(),
    body = blessed.box({
      top: 1,
      left: 0,
      width: '100%',
      height: '99%'
    }),
    statusbar = blessed.box({
      top: 0,
      left: 0,
      width: '100%',
      height: 1,
      style: {
        fg: 'white',
        bg: 'blue'
      }
    });

screen.append(statusbar);
screen.append(body);

screen.key(['escape', 'q', 'C-c'], function(ch, key) {
  return process.exit(0);
});

function status(text) { statusbar.setContent(text); screen.render(); }
function log(text) { body.insertLine(0, text); screen.render(); }

var c = 1;
setInterval(function() {
  status((new Date()).toISOString());
  log('This is line #' + (c++));
}, 100);

这是一个效果几乎相同的简单示例(状态栏不会用背景颜色填充额外的空间):

var screen = blessed.screen(),
    body = blessed.box({
      top: 0,
      left: 0,
      width: '100%',
      height: '100%',
      tags: true
    });

screen.append(body);

screen.key(['escape', 'q', 'C-c'], function(ch, key) {
  return process.exit(0);
});

function status(text) {
  body.setLine(0, '{blue-bg}' + text + '{/blue-bg}');
  screen.render();
}
function log(text) {
  body.insertLine(1, text);
  screen.render();
}

var c = 1;
setInterval(function() {
  status((new Date()).toISOString());
  log('This is line #' + (c++));
}, 100);

答案 1 :(得分:4)

除了有很多节点模块可以帮助你做到这一点,(blessedncursesansitermhelper),出于教育目的,你也可以使用process.stdout.moveCursor

轻松地使用vanilla节点
var logs = [];
function log(text) {
  logs.push(text);
  console.log(text);
}
function changeCounter(n) {
  process.stdout.moveCursor(0, -logs.length - 1);
  printCounter(n);
  logs.forEach(function (log) { console.log(log) });
}
function printCounter(n) {
  console.log('Counter is:', n);
}

// Now lets test
printCounter(0);
var i = 1;
setInterval(function () {
  log('meoww');
  changeCounter(i++);
});

虽然您必须写入额外的代码以防止溢出终端。

答案 2 :(得分:2)

用于执行此类操作的传统库(在屏幕底部以外绘制文本)是&#34; curses&#34; ...有Node.js的绑定但是还有#34 ;福地&#34; (哈哈)看起来更容易使用:https://github.com/chjj/blessed