我想隐藏密码输入.我在stackoverflow中看到很多答案但是如果我按退格键我无法验证值.条件返回false.
我尝试了几种解决方案来覆盖这个功能,但是如果按下退格键,我遇到缓冲区的问题,我得到了隐形字符\b
.
我按下:"A",退格,"B",我在缓冲区中有这个:"\ u0041\u0008\u0042"(toString()='A\bB')而不是"B".
我有 :
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question("password : ", function(password) { console.log("Your password : " + password); });
小智.. 36
这可以通过读取线来处理,通过静音流拦截输出,如在npm(https://github.com/isaacs/read/blob/master/lib/read.js)上的读取项目中所做的那样:
var readline = require('readline'); var Writable = require('stream').Writable; var mutableStdout = new Writable({ write: function(chunk, encoding, callback) { if (!this.muted) process.stdout.write(chunk, encoding); callback(); } }); mutableStdout.muted = false; var rl = readline.createInterface({ input: process.stdin, output: mutableStdout, terminal: true }); rl.question('Password: ', function(password) { console.log('\nPassword is ' + password); rl.close(); }); mutableStdout.muted = true;
A-312.. 26
覆盖应用程序的readline接口的_writeToOutput:https://github.com/nodejs/node/blob/v9.5.0/lib/readline.js#L291
要隐藏密码输入,您可以使用:
当您按下触摸时,此解决方案具有动画:
password : [-=] password : [=-]
代码 :
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.stdoutMuted = true; rl.query = "Password : "; rl.question(rl.query, function(password) { console.log('\nPassword is ' + password); rl.close(); }); rl._writeToOutput = function _writeToOutput(stringToWrite) { if (rl.stdoutMuted) rl.output.write("\x1B[2K\x1B[200D"+rl.query+"["+((rl.line.length%2==1)?"=-":"-=")+"]"); else rl.output.write(stringToWrite); };
此序列"\ x1B [2K\x1BD"使用两个转义序列:
Esc [2K:清除整条线.
Esc D:向上移动/滚动窗口一行.
要了解更多信息,请阅读:http://ascii-table.com/ansi-escape-sequences-vt-100.php
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.stdoutMuted = true; rl.question('Password: ', function(password) { console.log('\nPassword is ' + password); rl.close(); }); rl._writeToOutput = function _writeToOutput(stringToWrite) { if (rl.stdoutMuted) rl.output.write("*"); else rl.output.write(stringToWrite); };
rl.history = rl.history.slice(1);
如果您使用严格模式更改'\ 033 [2K\033 [200D'到'\ x1B [2K\x1B [200D'.这只是将已弃用的八进制转义符更改为等效的十六进制转义符. (2认同)
estaples.. 7
您可以使用readline-sync
模块而不是节点readline
.
密码隐藏功能是通过它的"hideEchoBack"选项内置的.
https://www.npmjs.com/package/readline-sync
这可以通过读取线来处理,通过静音流拦截输出,如在npm(https://github.com/isaacs/read/blob/master/lib/read.js)上的读取项目中所做的那样:
var readline = require('readline'); var Writable = require('stream').Writable; var mutableStdout = new Writable({ write: function(chunk, encoding, callback) { if (!this.muted) process.stdout.write(chunk, encoding); callback(); } }); mutableStdout.muted = false; var rl = readline.createInterface({ input: process.stdin, output: mutableStdout, terminal: true }); rl.question('Password: ', function(password) { console.log('\nPassword is ' + password); rl.close(); }); mutableStdout.muted = true;
覆盖应用程序的readline接口的_writeToOutput:https://github.com/nodejs/node/blob/v9.5.0/lib/readline.js#L291
要隐藏密码输入,您可以使用:
当您按下触摸时,此解决方案具有动画:
password : [-=] password : [=-]
代码 :
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.stdoutMuted = true; rl.query = "Password : "; rl.question(rl.query, function(password) { console.log('\nPassword is ' + password); rl.close(); }); rl._writeToOutput = function _writeToOutput(stringToWrite) { if (rl.stdoutMuted) rl.output.write("\x1B[2K\x1B[200D"+rl.query+"["+((rl.line.length%2==1)?"=-":"-=")+"]"); else rl.output.write(stringToWrite); };
此序列"\ x1B [2K\x1BD"使用两个转义序列:
Esc [2K:清除整条线.
Esc D:向上移动/滚动窗口一行.
要了解更多信息,请阅读:http://ascii-table.com/ansi-escape-sequences-vt-100.php
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.stdoutMuted = true; rl.question('Password: ', function(password) { console.log('\nPassword is ' + password); rl.close(); }); rl._writeToOutput = function _writeToOutput(stringToWrite) { if (rl.stdoutMuted) rl.output.write("*"); else rl.output.write(stringToWrite); };
rl.history = rl.history.slice(1);
您可以使用readline-sync
模块而不是节点readline
.
密码隐藏功能是通过它的"hideEchoBack"选项内置的.
https://www.npmjs.com/package/readline-sync