refactor(密码输入): 使用readline重构密码输入函数并添加确认功能

This commit is contained in:
zhang1106
2026-03-18 15:17:24 +08:00
parent f5eb1dbf8e
commit 51181b2dd6
+23 -34
View File
@@ -190,50 +190,39 @@ function ask(question, defaultValue = '') {
}
/**
* 密码输入函数 - 隐藏输入内容
* 密码输入函数 - 隐藏输入内容并显示星号
*
* @param {string} question - 提示问题文本
* @param {boolean} requireConfirm - 是否需要确认密码
* @returns {Promise<string>} 用户输入的密码
*
* 使用示例:
* const password = await askPassword('请输入密码');
* const password = await askPassword('请输入密码', true); // 需要确认
*/
function askPassword(question) {
function askPassword(question, requireConfirm = false) {
return new Promise((resolve) => {
process.stdout.write(`${question}: `);
const rl2 = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let password = '';
const wasRaw = process.stdin.isRaw;
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.setEncoding('utf8');
const onData = (data) => {
const char = data.toString();
const code = char.charCodeAt(0);
if (code === 10 || code === 13) {
process.stdin.setRawMode(wasRaw || false);
process.stdin.removeListener('data', onData);
process.stdout.write('\n');
resolve(password);
} else if (code === 3) {
process.stdin.setRawMode(wasRaw || false);
process.stdout.write('\n已取消\n');
process.exit(0);
} else if (code === 127 || code === 8) {
if (password.length > 0) {
password = password.slice(0, -1);
process.stdout.write('\b \b');
}
} else if (code >= 32 && code < 127) {
password += char;
process.stdout.write('*');
rl2.question(`${question}: `, { silent: true }, (password1) => {
if (requireConfirm) {
rl2.question('请再次输入密码确认: `, { silent: true }, (password2) => {
rl2.close();
if (password1 === password2) {
resolve(password1);
} else {
log.error('两次输入的密码不一致请重新输入');
resolve(askPassword(question, requireConfirm));
}
});
} else {
rl2.close();
resolve(password1);
}
};
process.stdin.on('data', onData);
});
});
}