Mô-đun Node.js TTY chứa các lớp tty.ReadStream và tty.WriteStream. Trong hầu hết các trường hợp, không cần sử dụng trực tiếp mô-đun này.
TTY là gì?
TTY là viết tắt của “Teletypewriter” hoặc “TeleTYpewriter”, là một thuật ngữ được sử dụng để chỉ các thiết bị đầu cuối trong hệ thống máy tính hoặc máy tính cá nhân. Trong ngữ cảnh của Node.js, TTY là một module có sẵn cung cấp giao diện tương tác với các thiết bị đầu cuối (như terminal) thông qua luồng nhập và xuất dữ liệu.
Trong Node.js, TTY cung cấp các phương pháp và sự kiện cho phép ứng dụng tương tác với người dùng thông qua terminal. Nó hỗ trợ đọc dữ liệu từ terminal, ghi dữ liệu đến terminal, xử lý sự kiện liên quan đến bàn phím và chuột, cũng như các chức năng khác như điều khiển con trỏ, màu sắc và các tùy chọn khác.
TTY là một phần quan trọng trong việc xây dựng các ứng dụng dòng lệnh, công cụ dòng lệnh và các giao diện dòng lệnh trong Node.js. Nó cho phép bạn tương tác trực tiếp với người dùng thông qua terminal và xử lý đầu vào và đầu ra một cách linh hoạt.
Xem thêm Kali Linux – Terminal hướng dẫn cơ bản
Bạn phải sử dụng request (‘tty’) để truy cập mô-đun này.
Cú pháp:
var tty = request ('tty');
Khi Node.js phát hiện ra rằng nó đang được chạy bên trong ngữ cảnh TTY, thì:
- process.stdin sẽ là một phiên bản tty.ReadStream
- process.stdout sẽ là một cá thể tty.WriteStream
Để kiểm tra xem Node.js có đang chạy trong ngữ cảnh TTY hay không, hãy sử dụng lệnh sau:
node -p -e "Boolean (process.stdout.isTTY)"
Sử dụng TTY trong ứng dụng Node.js
Trong ứng dụng Node.js, bạn có thể sử dụng module TTY để tương tác với terminal và xử lý đầu vào và đầu ra. Dưới đây là một số cách sử dụng TTY trong ứng dụng Node.js:
- Đọc dữ liệu từ terminal:
const tty = require('tty'); process.stdin.setRawMode(true); // Thiết lập chế độ Raw để đọc dữ liệu process.stdin.resume(); // Tiếp tục đọc dữ liệu process.stdin.on('data', (data) => { const key = data.toString().trim(); // Xử lý dữ liệu nhập từ terminal console.log('Bạn đã nhập:', key); });
- Ghi dữ liệu đến terminal:
const tty = require('tty'); process.stdout.write('Hello, world!'); // Ghi dữ liệu đến terminal
- Xử lý sự kiện liên quan đến bàn phím:
const tty = require('tty'); process.stdin.on('keypress', (key) => { // Xử lý sự kiện nhấn phím console.log('Bạn đã nhấn phím:', key); });
- Điều khiển con trỏ và định dạng văn bản:
const tty = require('tty'); console.log(tty.isatty(process.stdout)); // Kiểm tra xem terminal có hỗ trợ định dạng văn bản không console.log(tty.getWindowSize()); // Lấy kích thước cửa sổ terminal // Thiết lập màu sắc console.log('\x1b[31mHello, world!\x1b[0m'); // In ra màn hình văn bản màu đỏ
Module TTY cung cấp nhiều phương thức và sự kiện khác để tương tác với terminal. Bạn có thể tìm hiểu thêm trong tài liệu chính thức của Node.js về module TTY để tận dụng đầy đủ tính năng của nó trong ứng dụng của mình.
Xem thêm Hướng dẫn cài đặt Nodejs
Class: ReadStream
Nó chứa một lớp con net.Socket đại diện cho phần có thể đọc được của một tty. Trong trường hợp bình thường, tty.ReadStream có cá thể duy nhất có tên process.stdin trong bất kỳ chương trình Node.js nào (chỉ khi isatty (0) là true).
rs.isRaw: Nó là một Boolean được khởi tạo thành false. Nó chỉ định trạng thái “thô” hiện tại của cá thể tty.ReadStream.
rs.setRawMode (chế độ): Nó phải là true hoặc false. Nó được sử dụng để đặt các thuộc tính của tty.ReadStream hoạt động như một thiết bị thô hoặc mặc định. isRaw sẽ được đặt ở chế độ kết quả.
Class: WriteStream
Nó chứa một lớp con net.Socket đại diện cho phần có thể ghi của tty. Trong trường hợp bình thường, tty.WriteStream có cá thể duy nhất có tên process.stdout trong bất kỳ chương trình Node.js nào (chỉ khi isatty (1) là true).
Sự kiện thay đổi kích thước: Sự kiện này được sử dụng khi một trong các thuộc tính cột hoặc hàng đã thay đổi.
Cú pháp:
process.stdout.on('resize', () => { console.log('screen size has changed!'); console.log(`${process.stdout.columns}x${process.stdout.rows}`); });
ws.columns: Nó được sử dụng để cung cấp số lượng cột mà TTY hiện có. Thuộc tính này được cập nhật về các sự kiện ‘thay đổi kích thước’.
ws.rows: Nó được sử dụng để cung cấp số hàng mà TTY hiện có. Thuộc tính này được cập nhật về các sự kiện ‘thay đổi kích thước’.
Xem thêm Nodejs là gì? Tại sao nên sử dụng Nodejs
Xử lý lỗi và xử lý ngoại lệ trong TTY
Trong quá trình sử dụng TTY trong Node.js, bạn cần xử lý các lỗi và ngoại lệ có thể xảy ra. Dưới đây là một số cách để xử lý lỗi và ngoại lệ trong TTY:
- Sử dụng try-catch để bắt ngoại lệ:
try { // Code xử lý TTY } catch (error) { // Xử lý ngoại lệ console.error('Có lỗi xảy ra:', error); }
- Sử dụng sự kiện ‘error’ để bắt lỗi:
const tty = require('tty'); const t = tty.createReadStream('nonexistent.txt'); t.on('error', (error) => { // Xử lý lỗi console.error('Có lỗi xảy ra:', error); });
- Xử lý lỗi bằng cách trả về giá trị null hoặc giá trị mặc định:
const tty = require('tty'); function readInput() { try { const input = process.stdin.read(); if (input === null) { // Xử lý khi không có dữ liệu đọc được return null; } // Xử lý dữ liệu đọc được return input; } catch (error) { // Xử lý ngoại lệ console.error('Có lỗi xảy ra:', error); return null; } }
- Xử lý lỗi bằng cách trả về promise hoặc sử dụng async/await:
const tty = require('tty'); function readInput() { return new Promise((resolve, reject) => { try { const input = process.stdin.read(); if (input === null) { // Xử lý khi không có dữ liệu đọc được resolve(null); } // Xử lý dữ liệu đọc được resolve(input); } catch (error) { // Xử lý ngoại lệ reject(error); } }); } async function handleInput() { try { const input = await readInput(); // Xử lý dữ liệu đọc được } catch (error) { // Xử lý ngoại lệ console.error('Có lỗi xảy ra:', error); } } handleInput();
Quá trình xử lý lỗi và ngoại lệ trong TTY tương tự như xử lý lỗi và ngoại lệ trong Node.js thông thường. Bạn có thể sử dụng các cơ chế xử lý lỗi của Node.js như try-catch, sự kiện ‘error’, promise hoặc async/await để xử lý các trường hợp lỗi và ngoại lệ khi sử dụng TTY.
Xem thêm Module DNS Node.js
Tối ưu hóa và quản lý TTY trong Node.js
Khi làm việc với TTY trong Node.js, bạn có thể áp dụng một số phương pháp tối ưu hóa và quản lý để đảm bảo hiệu suất và ổn định của ứng dụng. Dưới đây là một số gợi ý tối ưu hóa và quản lý TTY trong Node.js:
- Đảm bảo xử lý đồng bộ: Khi sử dụng TTY, hãy đảm bảo rằng các hoạt động đọc và ghi vào TTY được xử lý đồng bộ để tránh xung đột và lỗi. Sử dụng các phương thức và sự kiện có sẵn trong module TTY để quản lý các hoạt động đọc và ghi một cách chính xác.
- Xử lý đóng TTY: Khi kết thúc việc sử dụng TTY, hãy đảm bảo rằng bạn đóng TTY một cách chính xác để giải phóng tài nguyên hệ thống. Sử dụng phương thức close() hoặc hủy đăng ký các sự kiện liên quan đến TTY để đảm bảo rằng TTY được đóng đúng cách.
- Kiểm tra tính khả dụng của TTY: Trước khi sử dụng TTY, hãy kiểm tra tính khả dụng của nó trong môi trường hiện tại. Sử dụng các phương thức như isTTY và process.stdout.isTTY để kiểm tra xem TTY có khả dụng hay không.
- Xử lý lỗi và ngoại lệ: Đảm bảo rằng bạn có cơ chế xử lý lỗi và ngoại lệ khi làm việc với TTY. Sử dụng try-catch hoặc xử lý sự kiện ‘error’ để bắt và xử lý các lỗi và ngoại lệ có thể xảy ra trong quá trình sử dụng TTY.
- Đồng bộ hóa đầu vào và đầu ra: Khi sử dụng TTY cho việc đọc và ghi dữ liệu từ người dùng, hãy đảm bảo rằng các hoạt động đọc và ghi được đồng bộ hóa để tránh việc mất dữ liệu hoặc xung đột.
- Quản lý bộ nhớ: Khi làm việc với dữ liệu lớn trong TTY, hãy đảm bảo rằng bạn quản lý bộ nhớ một cách hiệu quả. Sử dụng các phương pháp như đọc dữ liệu theo từng phần, giới hạn kích thước bộ đệm hoặc sử dụng stream để xử lý dữ liệu lớn mà không làm quá tải bộ nhớ.
- Kiểm tra khả năng hỗ trợ: Trong một số trường hợp, TTY có thể không được hỗ trợ hoặc có hạn chế trên một số môi trường. Kiểm tra khả năng hỗ trợ TTY trong môi trường đích của bạn và cung cấp các phương thức thay thế hoặc xử lý khi TTY không khả dụng.
Bằng cách tối ưu hóa và quản lý TTY trong ứng dụng Node.js, bạn có thể đảm bảo tính ổn định và hiệu suất của ứng dụng khi làm việc với giao diện người dùng tương tác.
Xem thêm NestJS trong Node.js