Вход пользователя в Node.js
Я пишу программу, которая создаст массив чисел и удвоит содержимое каждого массива и сохранит результат как пару ключ/значение. Раньше я жестко закодировал массив, так что все было в порядке.
Теперь я немного изменил логику, хочу взять данные от пользователей, а затем сохранить значение в массиве.
Моя проблема в том, что я не могу понять, как это сделать, используя node.js. Я установил модуль приглашения с помощью npm install prompt, а также просмотрел документацию, но ничего не работает.
Я знаю, что делаю здесь небольшую ошибку.
Здесь мой код:
//Javascript program to read the content of array of numbers
//Double each element
//Storing the value in an object as key/value pair.
//var Num=[2,10,30,50,100]; //Array initialization
var Num = new Array();
var i;
var obj = {}; //Object initialization
function my_arr(N) { return N;} //Reads the contents of array
function doubling(N_doubled) //Doubles the content of array
{
doubled_number = my_arr(N_doubled);
return doubled_number * 2;
}
//outside function call
var prompt = require('prompt');
prompt.start();
while(i!== "QUIT")
{
i = require('prompt');
Num.push(i);
}
console.log(Num);
for(var i=0; i< Num.length; i++)
{
var original_value = my_arr(Num[i]); //storing the original values of array
var doubled_value = doubling(Num[i]); //storing the content multiplied by two
obj[original_value] = doubled_value; //object mapping
}
console.log(obj); //printing the final result as key/value pair
Пожалуйста, помогите мне в этом, спасибо.
Ответы
Ответ 1
Запрос является асинхронным, поэтому вы должны использовать его асинхронно.
var prompt = require('prompt')
, arr = [];
function getAnother() {
prompt.get('number', function(err, result) {
if (err) done();
else {
arr.push(parseInt(result.number, 10));
getAnother();
}
})
}
function done() {
console.log(arr);
}
prompt.start();
getAnother();
Это приведет к нажатию цифр до arr
, пока вы не нажмете Ctrl + C, после чего будет вызываться done
.
Ответ 2
Для тех, кто не хочет импортировать еще один модуль, вы можете использовать стандартный процесс nodejs.
function prompt(question, callback) {
var stdin = process.stdin,
stdout = process.stdout;
stdin.resume();
stdout.write(question);
stdin.once('data', function (data) {
callback(data.toString().trim());
});
}
Использовать регистр
prompt('Whats your name?', function (input) {
console.log(input);
process.exit();
});
Ответ 3
Современный пример Node.js с обещаниями ES6 и без сторонних библиотек.
Рик предоставил отличную отправную точку, но вот более полный пример того, как один подсказывает вопрос за вопросом и сможет ссылаться на эти ответы позже. Поскольку чтение/запись асинхронны, обещания/обратные вызовы являются единственным способом кодирования такого потока в JavaScript.
const { stdin, stdout } = process;
function prompt(question) {
return new Promise((resolve, reject) => {
stdin.resume();
stdout.write(question);
stdin.on('data', data => resolve(data.toString().trim()));
stdin.on('error', err => reject(err));
});
}
async function main() {
try {
const name = await prompt("What your name? ")
const age = await prompt("What your age? ");
const email = await prompt("What your email address? ");
const user = { name, age, email };
console.log(user);
stdin.pause();
} catch(error) {
console.log("There an error!");
console.log(error);
}
process.exit();
}
main();
Ответ 4
Node.js реализовал простой модуль readline, который делает это асинхронно:
https://nodejs.org/api/readline.html
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What do you think of Node.js? ', (answer) => {
// TODO: Log the answer in a database
console.log('Thank you for your valuable feedback: ${answer}');
rl.close();
});