代码之家  ›  专栏  ›  技术社区  ›  Jeff Lambert

覆盖多个先前的终端输出

  •  1
  • Jeff Lambert  · 技术社区  · 6 年前

    我有一个webpack dev服务器代理,我想在服务器运行时在终端窗口中显示对代理的请求。更复杂的是,我想在接收到请求时显示它,然后在接收到响应后用状态代码更新最初编写的内容。例如,如果我请求GET/foo,我希望最初显示:

    (---) GET /foo
    

    (200) GET /foo
    

    我有这个(主要)工作与这个:

    const readline = require('readline');
    // ...
    devServer: {
        proxy: {
            onProxyReq: function (proxyReq, req, res) {
                process.stdout.write(`(---) ${req.method} ${req.url}`);
                proxyReq.on('response', function(response) {
                    readline.clearLine(process.stdout, 0);
                    readline.cursorTo(process.stdout, 0, null);
                    process.stdout.write(`(${response.statusCode}) ${req.method} ${req.url}\n`);
                });
            }
        }
    }
    // ...
    

    当在返回任何响应之前接收到多个请求时失败,在这种情况下,输出类似于以下内容:

    (---) GET /foo/1(---) GET /bar/2(---) GET /baz/3
    (200) GET /bar/2
    (200) GET /baz/3
    (200) GET /foo/1
    

    readline's moveCursor cursorTo ,但我不知道如何跟踪先前写入的行号。

    当接收到响应时,如何修改当前的内容以跟踪和覆盖正确的控制台输出行?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Doug Coburn    6 年前

    我想你需要用 readline.moveCursor 将光标相对于其当前位置移动以返回到与请求相对应的行。这也意味着您需要跟踪当前行或将其移回 x: 0 每次写作后。

    const readline = require('readline')
    
    let i = 0;
    const next = () => {
        if (i && i%3 === 0) readline.moveCursor(process.stdout, null, -3)
        readline.cursorTo(process.stdout, 0, null);
        readline.clearLine(process.stdout, 0);
        process.stdout.write(`${i}\n`);
        i += 1;
        if (i < 9) setTimeout(next, 200);
        else console.log();
    }
    setTimeout(next, 200);
    

    对于您的具体示例,我认为您需要更类似于以下内容的内容:

    const readline = require('readline');
    // ...
    urls = [];
    const rowOf = url => {
        let row = urls.indexOf(req.url);
        if (row === -1) {
            row = urls.length;
            urls.push(req.url);
        }
        return row;
    }
    
    const writeLine = (row, str) => {
        readline.moveCursor(process.stdout, null, row);
        readline.cursorTo(process.stdout, 0, null);
        readline.clearLine(process.stdout, 0);
        process.stdout.write(str);
        readline.moveCursor(process.stdout, null, -1*row);
        readline.cursorTo(process.stdout, 0, null);
    }
    
    devServer: {
        proxy: {
            onProxyReq: function (proxyReq, req, res) {
                writeLine(rowOf(req.url), `(---) ${req.method} ${req.url}`);
                proxyReq.on('response', function(response) {
                    writeLine(rowOf(req.url), `(${response.statusCode}) ${req.method} ${req.url}\n`)
                });
            }
        }
    }