Saya pikir membuat server http server sederhana dengan beberapa ekstensi konsol. Saya menemukan cuplikan untuk membaca dari data baris perintah.
var i = rl.createInterface(process.stdin, process.stdout, null);
i.question('Write your name: ', function(answer) {
console.log('Nice to meet you> ' + answer);
i.close();
process.stdin.destroy();
});
baik untuk mengajukan pertanyaan berulang kali, saya tidak bisa cukup menggunakan while(done) { }
loop? Juga baik jika server menerima output pada waktu pertanyaan, itu merusak saluran.
rl
maksud Anda readline ?while(done)
loop.Jawaban:
Anda tidak dapat melakukan loop "selagi (selesai)" karena itu akan membutuhkan pemblokiran pada input, sesuatu yang tidak ingin dilakukan node.js.
Alih-alih mengatur panggilan balik untuk dipanggil setiap kali sesuatu dimasukkan:
sumber
Saya telah menggunakan API lain untuk tujuan ini ..
Ini memungkinkan untuk meminta dalam lingkaran sampai jawabannya
right
. Juga memberikan konsol kecil yang bagus. Anda dapat menemukan detail @ http://nodejs.org/api/readline.html#readline_example_tiny_clisumber
API Readline telah berubah sedikit sejak 12 '. Doc's menunjukkan contoh yang berguna untuk menangkap input pengguna dari aliran standar:
Informasi lebih lanjut di sini.
sumber
Saya percaya ini layak mendapat
async-await
jawaban modern , dengan asumsi simpul> = 7.x digunakan.Jawabannya masih menggunakan
ReadLine::question
tetapi membungkusnya sehinggawhile (done) {}
memungkinkan, yang merupakan sesuatu yang ditanyakan OP secara eksplisit.dan kemudian contoh penggunaan
mengarah ke percakapan berikut
sumber
Silakan gunakan readline-sync , ini memungkinkan Anda bekerja dengan konsol sinkron tanpa panggilan balik. Bahkan bekerja dengan kata sandi:
sumber
@rob jawaban akan bekerja sebagian besar waktu, tetapi mungkin tidak berfungsi seperti yang Anda harapkan dengan input panjang.
Itulah yang seharusnya Anda gunakan:
Penjelasan mengapa solusi ini bekerja:
addListener('data')
berfungsi seperti buffer, panggilan balik akan dipanggil saat penuh atau / dan itu adalah akhir dari input.Bagaimana dengan input panjang? Tunggal
'data'
panggilan balik saja tidak akan cukup, karenanya Anda akan mendapatkan input terbagi menjadi dua bagian atau lebih. Itu sering tidak nyaman.addListener('end')
akan memberi tahu kami ketika pembaca stdin selesai membaca masukan kami. Karena kami telah menyimpan data sebelumnya, kami sekarang dapat membaca dan memproses semuanya bersama-sama.sumber
Saya sarankan menggunakan Inquirer , karena menyediakan kumpulan antarmuka pengguna baris perintah interaktif umum.
sumber
Ini sebuah contoh:
Keluaran:
sumber
Ini terlalu rumit. Versi yang lebih mudah:
akan digunakan
maka itu akan menunggu saat Anda menggunakan
maka lebih mudah diulang. sebagai contoh:
sumber
Kasus penggunaan umum mungkin untuk aplikasi untuk menampilkan prompt generik dan menanganinya dalam pernyataan beralih.
Anda bisa mendapatkan perilaku yang setara dengan loop sementara dengan menggunakan fungsi pembantu yang akan memanggil dirinya sendiri dalam callback:
Anda dapat melewatkan string kosong alih-alih
'app> '
jika aplikasi Anda sudah mencetak sesuatu ke layar di luar loop ini.sumber
Pendekatan saya untuk ini adalah dengan menggunakan generator async .
Dengan asumsi Anda memiliki serangkaian pertanyaan:
Untuk menggunakan
await
kata kunci, Anda harus membungkus program Anda menjadi IIFE async.Hasil yang diharapkan:
Jika Anda ingin mendapatkan jawaban sekaligus pertanyaan, Anda dapat mencapainya dengan modifikasi sederhana:
sumber
Saya harus menulis permainan "tic-tac-toe" di Node yang mengambil input dari baris perintah, dan menulis blok kode async / menunggu dasar yang melakukan trik ini.
sumber
Memblokir readline, membuka blokir perilaku
Bayangkan Anda memiliki tiga pertanyaan yang harus dijawab dari konsol, karena Anda sekarang tahu kode ini tidak akan berjalan karena modul standar readline memiliki perilaku 'tidak terblokir' yang mengatakan setiap rl.pertanyaan adalah utas independen sehingga kode ini tidak akan berjalan.
Menjalankan output:
Solusi yang diusulkan menggunakan emitor peristiwa untuk memberi sinyal akhir dari unblocking thread, dan termasuk loop logika dan akhir program ke dalam fungsi pendengarnya.
Menjalankan output:
sumber
Saya telah membuat sebuah skrip kecil untuk direktori baca dan menulis file baru nama konsol (contoh: 'name.txt') dan teks ke dalam file.
sumber
Cara termudah adalah menggunakan readline-sync
Ini memproses satu per satu input dan output.
misalnya:
sumber
require
pernyataan Anda . Tidak ada alasan untuk meninggalkannya.