2011-11-14 13 views
94

मैंने कुछ कंसोल एक्सटेंशन के साथ एक सरल सर्वर http सर्वर बनाने का विचार किया। मुझे कमांड लाइन डेटा से पढ़ने के लिए स्निपेट मिला।कंसोल से मूल्य पढ़ना, इंटरैक्टिव

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(); 

    }); 

अच्छी तरह से सवाल बार-बार पूछने के लिए, मैं बस while(done) { } पाश का उपयोग नहीं कर सकते? साथ ही अगर सर्वर प्रश्न समय पर आउटपुट प्राप्त करता है, तो यह लाइन को खंडित करता है।

+1

मुझे लगता है कि 'आरएल' का मतलब है [readline] (https://stackoverflow.com/a/14513763/712526)? – jpaugh

उत्तर

109

आप "जबकि (किया गया)" लूप नहीं कर सकते क्योंकि उसे इनपुट पर अवरुद्ध करने की आवश्यकता होगी, कुछ node.js करना पसंद नहीं है। ..

var stdin = process.openStdin(); 

stdin.addListener("data", function(d) { 
    // note: d is an object, and when converted to a string it will 
    // end with a linefeed. so we (rather crudely) account for that 
    // with toString() and then trim() 
    console.log("you entered: [" + 
     d.toString().trim() + "]"); 
    }); 
+1

धन्यवाद यह काम करता है, क्या "अंत" श्रोता कुछ बंद संचालन को कॉल करने और 'अलविदा' कहने की अनुमति देता है? –

+0

मैंने उदाहरण से "एंड" श्रोता को हटा दिया, मुझे नहीं पता कि यह ईमानदार होने के लिए वास्तव में उपयोगी होगा। – rob

+0

यदि कथन के साथ टाइप किए गए डेटा को नियंत्रित करने के लिए कैसे? या swtich मामले? –

72

मैं इस उद्देश्य के लिए एक और एपीआई का उपयोग किया है

var readline = require('readline'); 
var rl = readline.createInterface(process.stdin, process.stdout); 
rl.setPrompt('guess> '); 
rl.prompt(); 
rl.on('line', function(line) { 
    if (line === "right") rl.close(); 
    rl.prompt(); 
}).on('close',function(){ 
    process.exit(0); 
}); 

यह जब तक पाश में संकेत करने के लिए अनुमति देता है:

इसके बजाय हर बार कुछ दर्ज किया गया है के नाम से जाना एक कॉलबैक की स्थापना जवाब right है। इसके अलावा यह अच्छा छोटा कंसोल देता है। आप विवरण देख सकते हैं @http://nodejs.org/api/readline.html#readline_example_tiny_cli

+5

यह एक अच्छा जवाब है। क्या स्पष्ट नहीं हो सकता है (लेकिन एक बड़ा प्लस है) यह है कि रीडलाइन बाहरी निर्भरता नहीं है: यह node.js. का हिस्सा है। – jlh

22

रीडलाइन एपीआई 12 से काफी बदल गया है। दस्तावेज़ के शो एक उपयोगी उदाहरण के लिए एक मानक धारा से उपयोगकर्ता इनपुट पर कब्जा करने की:

const readline = require('readline'); 

const rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

rl.question('What do you think of Node.js? ', (answer) => { 
    console.log('Thank you for your valuable feedback:', answer); 
    rl.close(); 
}); 

More information here.

+2

यह सिर्फ एक बुनियादी उदाहरण है। आप कैसे बातचीत करते हैं? सवाल जवाब? एकाधिक विकल्प और पसंद है? एक बार बंद होने पर आरएल को फिर से खोलने के लिए, यदि उपयोगकर्ता के साथ बातचीत करने के लिए ओपन आरएल के साथ काम नहीं करना है, तो कुछ तर्क –

8

@rob जवाब समय की सबसे काम करेंगे, लेकिन जैसा कि आप लंबे समय से जानकारी के साथ उम्मीद यह काम नहीं हो सकता है।

है यही कारण है कि आप के बजाय का उपयोग करना चाहिए: क्यों इस समाधान काम करता है पर

const stdin = process.openStdin(); 
let content = ''; 

stdin.addListener('data', d => { 
    content += d.toString(); 
}); 

stdin.addListener('end',() => { 
    console.info(`Input: ${content}`); 
}); 

स्पष्टीकरण: एक बफर की तरह

addListener('data') काम करता है, कॉलबैक बुलाया जाएगा जब यह है पूर्ण या/और यह इनपुट का अंत है।

लंबे इनपुट के बारे में क्या? एक एकल 'data' कॉलबैक पर्याप्त नहीं होगा, इसलिए यह आपको दो या अधिक हिस्सों में अपना इनपुट विभाजित कर देगा। यह अक्सर सुविधाजनक नहीं है।

addListener('end') हमें सूचित करेगा जब stdin पाठक हमारे इनपुट को पढ़ा जाता है। चूंकि हम पिछले डेटा को संग्रहीत कर रहे हैं, अब हम इसे एक साथ पढ़ और संसाधित कर सकते हैं।

8

कृपया readline-sync का उपयोग करें, इससे आपको सिंक्रोनस कंसोल के साथ कॉलबैक हेल्स के साथ काम करने की सुविधा मिलती है। यहां तक ​​कि पासवर्ड के साथ काम करता है:

var favFood = read.question('What is your favorite food? ', { 
 
    hideEchoBack: true // The typed text on screen is hidden by `*` (default). 
 
});

+0

सहित इसे अतिरिक्त निर्भरता की आवश्यकता है, इसलिए मैं अन्य समाधान पसंद करूंगा। –

2

मेरा मानना ​​है कि यह एक आधुनिक async-await जवाब हकदार, यह मानते हुए नोड> = 7.x प्रयोग किया जाता है।

उत्तर अभी भी ReadLine::question का उपयोग करता है लेकिन इसे लपेटता है ताकि while (done) {} संभव हो, जो ओपी स्पष्ट रूप से कुछ पूछता है।

var cl = readln.createInterface(process.stdin, process.stdout); 
var question = function(q) { 
    return new Promise((res, rej) => { 
     cl.question(q, answer => { 
      res(answer); 
     }) 
    }); 
}; 

और फिर एक उदाहरण उपयोग

(async function main() { 
    var answer; 
    while (answer != 'yes') { 
     answer = await question('Are you sure? '); 
    } 
    console.log('finally you are sure!'); 
})(); 

बातचीत निम्नलिखित

Are you sure? no 
Are you sure? no 
Are you sure? yes 
finally you are sure! 
0

का उपयोग आम तौर की ओर जाता है शायद एप्लिकेशन एक सामान्य शीघ्र प्रदर्शित करने और एक में इसे संभाल करने के लिए किया जाएगा स्विच स्टेटमेंट

आप एक सहायक समारोह है कि खुद को कॉलबैक में कहेंगे का उपयोग करके थोड़ी देर के पाश करने के लिए एक व्यवहार बराबर मिल सकता है:

const readline = require('readline'); 
const rl = readline.createInterface(process.stdin, process.stdout); 

function promptInput (prompt, handler) 
{ 
    rl.question(prompt, input => 
    { 
     if (handler(input) !== false) 
     { 
      promptInput(prompt, handler); 
     } 
     else 
     { 
      rl.close(); 
     } 
    }); 
} 

promptInput('app> ', input => 
{ 
    switch (input) 
    { 
     case 'my command': 
      // handle this command 
      break; 
     case 'exit': 
      console.log('Bye!'); 
      return false; 
    } 
}); 

आप 'app> ' के बजाय कोई रिक्त स्ट्रिंग गुजर सकता है आपके एप्लिकेशन पहले से ही करने के लिए कुछ प्रिंट अगर इस लूप के बाहर स्क्रीन।

संबंधित मुद्दे