2011-01-16 21 views

Trả lời

10

Cập nhật 2015 ngày 13 tháng 12: readline đã thay thế process.stdinnode_stdio was removed from Node 0.5.10.

var BACKSPACE = String.fromCharCode(127); 


// Probably should use readline 
// https://nodejs.org/api/readline.html 
function getPassword(prompt, callback) { 
    if (prompt) { 
     process.stdout.write(prompt); 
    } 

    var stdin = process.stdin; 
    stdin.resume(); 
    stdin.setRawMode(true); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 

    var password = ''; 
    stdin.on('data', function (ch) { 
     ch = ch.toString('utf8'); 

     switch (ch) { 
     case "\n": 
     case "\r": 
     case "\u0004": 
      // They've finished typing their password 
      process.stdout.write('\n'); 
      stdin.setRawMode(false); 
      stdin.pause(); 
      callback(false, password); 
      break; 
     case "\u0003": 
      // Ctrl-C 
      callback(true); 
      break; 
     case BACKSPACE: 
      password = password.slice(0, password.length - 1); 
      process.stdout.clearLine(); 
      process.stdout.cursorTo(0); 
      process.stdout.write(prompt); 
      process.stdout.write(password.split('').map(function() { 
       return '*'; 
      }).join('')); 
      break; 
     default: 
      // More passsword characters 
      process.stdout.write('*'); 
      password += ch; 
      break; 
     } 
    }); 
} 

getPassword('Password: '); 
+0

Bạn không thể xác minh giá trị. Nếu bạn nhấn backspace hoặc liên lạc khác không phải là chữ số. –

+0

'require ('tty'). SetRawMode()' không được chấp nhận. – Scruffy

5

Để thực hiện điều này, tôi thấy điều này tuyệt vời Google Group post

nào chứa đoạn mã sau:

var stdin = process.openStdin() 
    , stdio = process.binding("stdio") 
stdio.setRawMode() 

var password = "" 
stdin.on("data", function (c) { 
    c = c + "" 
    switch (c) { 
    case "\n": case "\r": case "\u0004": 
     stdio.setRawMode(false) 
     console.log("you entered: "+password) 
     stdin.pause() 
     break 
    case "\u0003": 
     process.exit() 
     break 
    default: 
     password += c 
     break 
    } 
}) 
+0

Note process.binding ("stdio") không còn hoạt động trong các phiên bản hiện tại của nút – mikemaccana

3

Đây là phiên bản của tôi tinh chỉnh của thợ làm đinh của từ trên cao, được cập nhật để có được một cuộc gọi lại và cho nút 0.8 sử dụng:

/** 
* Get a password from stdin. 
* 
* Adapted from <http://stackoverflow.com/a/10357818/122384>. 
* 
* @param prompt {String} Optional prompt. Default 'Password: '. 
* @param callback {Function} `function (cancelled, password)` where 
*  `cancelled` is true if the user aborted (Ctrl+C). 
* 
* Limitations: Not sure if backspace is handled properly. 
*/ 
function getPassword(prompt, callback) { 
    if (callback === undefined) { 
     callback = prompt; 
     prompt = undefined; 
    } 
    if (prompt === undefined) { 
     prompt = 'Password: '; 
    } 
    if (prompt) { 
     process.stdout.write(prompt); 
    } 

    var stdin = process.stdin; 
    stdin.resume(); 
    stdin.setRawMode(true); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 

    var password = ''; 
    stdin.on('data', function (ch) { 
     ch = ch + ""; 

     switch (ch) { 
     case "\n": 
     case "\r": 
     case "\u0004": 
      // They've finished typing their password 
      process.stdout.write('\n'); 
      stdin.setRawMode(false); 
      stdin.pause(); 
      callback(false, password); 
      break; 
     case "\u0003": 
      // Ctrl-C 
      callback(true); 
      break; 
     default: 
      // More passsword characters 
      process.stdout.write('*'); 
      password += ch; 
      break; 
     } 
    }); 
} 
+0

Bạn có thể xử lý backspace bằng câu lệnh bổ sung cho '" u007F "'. Nếu mật khẩu cho đến nay không trống, bạn có thể sử dụng 'process.stdout.write ('\ 033 [<1> D')' để di chuyển con trỏ trở lại một cột; sau đó bạn có thể viết một không gian, sau đó di chuyển trở lại một lần nữa. –

+0

Tôi cập nhật điều này để làm việc với backspace và sáp nhập nó với câu trả lời được chấp nhận ban đầu và thêm một liên kết đến một repo mà tôi dự định tiếp tục cải thiện. – CoolAJ86

47

Bạn có thể sử dụng read mô-đun (tiết lộ: bằng văn bản của tôi) cho việc này:

Trong shell của bạn:

npm install read 

Sau đó, trong JS của bạn:

var read = require('read') 
read({ prompt: 'Password: ', silent: true }, function(er, password) { 
    console.log('Your password is: %s', password) 
}) 
+2

https://github.com/isaacs/read - Đã có một số vấn đề khó khăn đối với mô-đun này, vì vậy, tôi đang xóa một liên kết tới đây để thuận tiện cho bạn. – paulolc

+1

Có phiên bản đồng bộ không? – mpen

+1

@Mark: Làm cách nào có thể? stdin là một dòng và cháy các sự kiện. Không thể xử lý sự kiện nếu chức năng đang chờ trả lại. – josh3736

Các vấn đề liên quan