node.js - কনসোল থেকে ইন্টারেক্টিভ, মান পড়া




console (10)

আমি কিছু কনসোল এক্সটেনশান সঙ্গে একটি সহজ সার্ভার 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) { } লুপ ব্যবহার করতে পারবেন না? এছাড়াও সার্ভার প্রশ্ন সময় আউটপুট পায় যদি ভাল, এটা লাইন ধ্বংস।


@rob উত্তরটি বেশিরভাগ সময় কাজ করবে, তবে দীর্ঘ ইনপুটগুলির সাথে আপনার প্রত্যাশা হিসাবে এটি কাজ করবে না।

পরিবর্তে আপনি কি ব্যবহার করা উচিত:

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

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

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

কেন এই সমাধান কাজ করে ব্যাখ্যা:

addListener('data') একটি বাফারের মতো কাজ করে, addListener('data') পূর্ণ হলে বা / এবং এটির শেষ হওয়ার পরে কল করা হবে।

দীর্ঘ ইনপুট সম্পর্কে কি? একটি একক 'data' কলব্যাক যথেষ্ট হবে না, তাই এটি আপনার দুটি ইনপুট বিভক্ত হয়ে যাবে। যে প্রায়ই সুবিধাজনক নয়।

addListener('end') পাঠক আমাদের ইনপুট পড়ার সময় addListener('end') আমাদের অবহিত করবে। যেহেতু আমরা পূর্ববর্তী তথ্য সংরক্ষণ করা হয়েছে, আমরা এখন এটি একসাথে পড়তে এবং প্রক্রিয়া করতে পারি।


আপনি "যখন (সম্পন্ন)" লুপ করতে পারবেন না কারণ এতে ইনপুট ব্লক করা প্রয়োজন, কিছু 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() + "]");
  });

আমি এই উদ্দেশ্যে অন্য API ব্যবহার করেছি ..

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 বিস্তারিতটি খুঁজে পেতে পারেন।


আমি পঠিত ডিরেক্টরির জন্য একটি ছোট স্ক্রিপ্ট craeted আছে এবং একটি কনসোল নাম নতুন ফাইল (উদাহরণ: 'name.txt') লিখুন এবং ফাইল টেক্সট।

const readline = require('readline');
const fs = require('fs');

const pathFile = fs.readdirSync('.');

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

file.question('Insert name of your file? ', (f) => {
  console.log('File is: ',f.toString().trim());
  try{
    file.question('Insert text of your file? ', (d) => {
      console.log('Text is: ',d.toString().trim());
      try {
        if(f != ''){
          if (fs.existsSync(f)) {
            //file exists
            console.log('file exist');
            return file.close();
          }else{
            //save file
            fs.writeFile(f, d, (err) => {
                if (err) throw err;
                console.log('The file has been saved!');
                file.close();
            });
          }
        }else{
          //file empty 
          console.log('Not file is created!');
          console.log(pathFile);
          file.close();
        }
      } catch(err) {
        console.error(err);
        file.close();
      }
    });
  }catch(err){
    console.log(err);
    file.close();
  }
});

এই overcomplicated হয়। এর একটি সহজ সংস্করণ:

var rl = require('readline');
rl.createInterface... etc

ব্যবহার করা হবে

var rl = require('readline-sync');

তারপর আপনি ব্যবহার করার সময় অপেক্ষা করবে

rl.question('string');

তারপর এটা পুনরাবৃত্তি সহজ। উদাহরণ স্বরূপ:

var rl = require('readline-sync');
for(let i=0;i<10;i++) {
    var ans = rl.question('What\'s your favourite food?');
    console.log('I like '+ans+' too!');
}

এই আমার পদ্ধতির Async জেনারেটর ব্যবহার করা হবে।

আপনি একটি প্রশ্ন অ্যারের আছে অনুমান:

 const questions = [
        "How are you today ?",
        "What are you working on ?",
        "What do you think of async generators ?",
    ]

await করার শব্দটি ব্যবহার করার জন্য, আপনাকে অবশ্যই আপনার প্রোগ্রামটি একটি অ্যাসাইন আইফেতে মোড়ানো আবশ্যক।

(async () => {

    questions[Symbol.asyncIterator] = async function * () {
        const stdin = process.openStdin()

        for (const q of this) {
            // The promise won't be solved until you type something
            const res = await new Promise((resolve, reject) => {
                console.log(q)

                stdin.addListener('data', data => {
                    resolve(data.toString())
                    reject('err')
                });
            })

            yield [q, res];
        }

    };

    for await (const res of questions) {
        console.log(res)
    }

    process.exit(0)
})();

প্রত্যাশিত ফলাফল:

How are you today ?
good
[ 'How are you today ?', 'good\n' ]
What are you working on ?
:)
[ 'What are you working on ?', ':)\n' ]
What do you think about async generators ?
awesome
[ 'What do you think about async generators ?', 'awesome\n' ]

আপনি যদি প্রশ্নগুলি সম্পূর্ণরূপে উত্তর পেতে চান, তবে আপনি এটি সহজ সংশোধন সহ অর্জন করতে পারেন:

const questionsAndAnswers = [];

    for await (const res of questions) {
        // console.log(res)
        questionsAndAnswers.push(res)
    }

    console.log(questionsAndAnswers)

   /*
     [ [ 'How are you today ?', 'good\n' ],
     [ 'What are you working on ?', ':)\n' ],
     [ 'What do you think about async generators ?', 'awesome\n' ] ]
   */

এখানে একটি উদাহরণ:

const stdin = process.openStdin()

process.stdout.write('Enter name: ')

stdin.addListener('data', text => {
  const name = text.toString().trim()
  console.log('Your name is: ' + name)

  stdin.pause() // stop reading
})

আউটপুট:

Enter name: bob
Your name is: bob

রেডলাইন এপিআই 1২ থেকে বেশ কিছুটা পরিবর্তিত হয়েছে। একটি আদর্শ প্রবাহ থেকে ব্যবহারকারী ইনপুট ক্যাপচার করার জন্য ডক এর একটি কার্যকর উদাহরণ প্রদর্শন করুন:

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

এখানে আরো তথ্য।


পুনর্বিবেচনার অবরোধ নিষিদ্ধ আচরণ / প্রতিশ্রুতি সঙ্গে বিকল্প সমাধান

কল্পনা থেকে উত্তর দেওয়ার জন্য আপনার তিনটি প্রশ্ন আছে, যেমন আপনি এখন জানেন যে এই কোডটি চালানো হবে না কারণ রেডলাইন স্ট্যান্ডার্ড মডিউলটি 'অবরোধ মুক্ত' আচরণ আছে বলে প্রতিটি RL.question একটি স্বাধীন থ্রেড যা এই কোডটি চালানো হবে না।

'use strict';

var questionaire=[['First Question: ',''],['Second Question: ',''],['Third Question: ','']];

function askaquestion(question) {
const readline = require('readline');

const rl = readline.createInterface(
    {input: process.stdin, output:process.stdout}
    );
  rl.question(question[0], function(answer) {
    console.log(answer);
    question[1] = answer;
    rl.close();
  });
};

var i=0;  
for (i=0; i < questionaire.length; i++) {
askaquestion(questionaire[i]);
}

console.log('Results:',questionaire );

চলমান আউটপুট:

>node test.js
Third Question: Results: [ [ 'First Question: ', '' ],
  [ 'Second Question: ', '' ],
  [ 'Third Question: ', '' ] ]        <--- the last question remain unoverwritten and then the final line of the program is shown as the threads were running waiting for answers (see below)
aaa        <--- I responded with a single 'a' that was sweeped by 3 running threads
a        <--- Response of one thread

a        <--- Response of another thread

a        <--- Response of another thread (there is no order on threads exit)

* প্রস্তাবিত সমাধান প্রতিশ্রুতি ব্যবহার করে তাই যখন আমরা প্রথম প্রশ্নটির প্রতিক্রিয়া দেখি তখন আমরা দ্বিতীয়টি প্রক্রিয়া করি।

'use strict';

var questionaire=[['First Question: ',null],['Second Question: ',null],['Third Question: ',null]];

function askaquestion(p_questionaire,p_i) {
p_questionaire[p_i][1] = new Promise(function (resolve,reject){ 
const readline = require('readline');

const rl = readline.createInterface(
    {input: process.stdin, output:process.stdout}
    );
rl.question(p_questionaire[p_i][0], function(answer) {
    //console.log(answer);
    resolve(answer),reject('error');
    rl.close();
    });
});
p_questionaire[p_i][1].then(resolve=>{
    if (p_i<p_questionaire.length-1) askaquestion(p_questionaire,p_i+1);
    else console.log('Results: ',p_questionaire) });
};

askaquestion(questionaire,0);

চলমান আউটপুট:

>node test3.js
First Question: 1
Second Question: 2
Third Question: 3
Results:  [ [ 'First Question: ', Promise { '1' } ],
  [ 'Second Question: ', Promise { '2' } ],
  [ 'Third Question: ', Promise { '3' } ] ]

পুনর্বিবেচনার অবরোধ নিষিদ্ধ আচরণ

কল্পনা থেকে উত্তর দেওয়ার জন্য আপনার তিনটি প্রশ্ন আছে, যেমন আপনি এখন জানেন যে এই কোডটি চালানো হবে না কারণ রেডলাইন স্ট্যান্ডার্ড মডিউলটি 'অবরোধ মুক্ত' আচরণ আছে বলে প্রতিটি RL.question একটি স্বাধীন থ্রেড যা এই কোডটি চালানো হবে না।

'use strict';

var questionaire=[['First Question: ',''],['Second Question: ',''],['Third Question: ','']];

function askaquestion(question) {
const readline = require('readline');

const rl = readline.createInterface(
    {input: process.stdin, output:process.stdout}
    );
  rl.question(question[0], function(answer) {
    console.log(answer);
    question[1] = answer;
    rl.close();
  });
};

var i=0;  
for (i=0; i < questionaire.length; i++) {
askaquestion(questionaire[i]);
}

console.log('Results:',questionaire );

চলমান আউটপুট:

node test.js
Third Question: Results: [ [ 'First Question: ', '' ],
  [ 'Second Question: ', '' ],
  [ 'Third Question: ', '' ] ]        <--- the last question remain unoverwritten and then the final line of the program is shown as the threads were running waiting for answers (see below)
aaa        <--- I responded with a single 'a' that was sweeped by 3 running threads
a        <--- Response of one thread

a        <--- Response of another thread

a        <--- Response of another thread (there is no order on threads exit)

প্রস্তাবিত সমাধান একটি আনব্লকিং থ্রেডের শেষে সংকেত দেওয়ার জন্য একটি ইভেন্ট ইমিটার ব্যবহার করে এবং তার শ্রোতা ফাংশনে লুপ লজিক এবং প্রোগ্রামের শেষ অন্তর্ভুক্ত করে।

'use strict';

var questionaire=[['First Question: ',''],['Second Question: ',''],['Third Question: ','']];

// Introduce EventEmitter object
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {};

const myEmitter = new MyEmitter();
myEmitter.on('continue', () => {
  console.log('continue...');
  i++; if (i< questionaire.length) askaquestion(questionaire[i],myEmitter);    // add here relevant loop logic
           else console.log('end of loop!\nResults:',questionaire );
});
//

function askaquestion(p_question,p_my_Emitter) { // add a parameter to include my_Emitter
const readline = require('readline');

const rl = readline.createInterface(
    {input: process.stdin, output:process.stdout}
    );
  rl.question(p_question[0], function(answer) {
    console.log(answer);
    p_question[1] = answer;
    rl.close();
    myEmitter.emit('continue');    // Emit 'continue' event after the question was responded (detect end of unblocking thread)
  });
};

/*var i=0;  
for (i=0; i < questionaire.length; i++) {
askaquestion(questionaire[i],myEmitter);
}*/

var i=0;
askaquestion(questionaire[0],myEmitter);        // entry point to the blocking loop


// console.log('Results:',questionaire )    <- moved to the truly end of the program

চলমান আউটপুট:

node test2.js
First Question: 1
1
continue...
Second Question: 2
2
continue...
Third Question: 3
3
continue...
done!
Results: [ [ 'First Question: ', '1' ],
  [ 'Second Question: ', '2' ],
  [ 'Third Question: ', '3' ] ]






console