Eu pensei em criar um servidor http simples com alguma extensão de console. Encontrei o trecho para ler os dados da linha de comando.
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();
});
bom fazer as perguntas repetidamente, não posso simplesmente usar o while(done) { }
loop? Também bem, se o servidor receber saída no momento da pergunta, ele arruinará a linha.
rl
você quer dizer readline ?while(done)
loop.Respostas:
você não pode fazer um loop "while (done)" porque isso exigiria bloqueio na entrada, algo que o node.js não gosta de fazer.
Em vez disso, configure um retorno de chamada a ser chamado sempre que algo for inserido:
fonte
Eu usei outra API para esse fim ..
Isso permite solicitar um loop até que a resposta seja
right
. Também fornece um pequeno console agradável. Você pode encontrar os detalhes em http://nodejs.org/api/readline.html#readline_example_tiny_clifonte
A API Readline mudou bastante desde os 12 '. Os documentos mostram um exemplo útil para capturar a entrada do usuário de um fluxo padrão:
Mais informações aqui.
fonte
Acredito que isso mereça uma
async-await
resposta moderna , assumindo que o nó> = 7.x seja usado.A resposta ainda usa,
ReadLine::question
mas a envolve, para quewhile (done) {}
seja possível, algo que o OP pergunta explicitamente.e, em seguida, um exemplo de uso
leva à seguinte conversa
fonte
Por favor, use o readline-sync , isso permite que você trabalhe com o console síncrono sem hells de retorno de chamada. Até funciona com senhas:
fonte
A resposta do @rob funcionará na maioria das vezes, mas pode não funcionar como o esperado com entradas longas.
É isso que você deve usar:
Explicação sobre por que esta solução funciona:
addListener('data')
funciona como um buffer, o retorno de chamada será chamado quando estiver cheio ou / e for o final da entrada.E quanto a entradas longas? Um único
'data'
retorno de chamada não será suficiente; portanto, você dividirá sua entrada em duas ou mais partes. Isso geralmente não é conveniente.addListener('end')
nos notificará quando o leitor stdin terminar de ler nossa entrada. Como armazenamos os dados anteriores, agora podemos ler e processar todos juntos.fonte
Eu recomendo usar o Inquirer , pois ele fornece uma coleção de interfaces de usuário comuns da linha de comando interativa.
fonte
Aqui está um exemplo:
Resultado:
fonte
Isso é muito complicado. Uma versão mais fácil de:
seria usar
então esperará quando você usar
então é mais fácil repetir. por exemplo:
fonte
Um caso de uso comum provavelmente seria o aplicativo exibir um prompt genérico e manipulá-lo em uma instrução switch.
Você pode obter um comportamento equivalente a um loop while usando uma função auxiliar que se chamaria no retorno de chamada:
Você pode passar uma string vazia em vez de
'app> '
se o seu aplicativo já imprimir algo na tela fora desse loop.fonte
Minha abordagem para isso seria usar geradores assíncronos .
Supondo que você tenha uma série de perguntas:
Para usar a
await
palavra - chave, você deve agrupar seu programa em um IIFE assíncrono.Resultados esperados:
Se você deseja obter perguntas e respostas por completo, pode conseguir isso com uma modificação simples:
fonte
Eu tive que escrever um jogo "jogo da velha" no Node, que recebia informações da linha de comando e escrevi esse bloco de código básico assíncrono / à espera que fazia o truque.
fonte
Bloqueando o comportamento desbloqueado da linha de leitura
Imagine que você tem três perguntas a serem respondidas no console, pois agora você sabe que esse código não será executado porque o módulo padrão readline possui um comportamento 'desbloqueado', dizendo que cada rl.question é um encadeamento independente, portanto esse código não será executado.
Saída em execução:
A solução proposta usa um emissor de eventos para sinalizar o final de um encadeamento de desbloqueio e inclui a lógica do loop e o final do programa em sua função de ouvinte.
Saída em execução:
fonte
Criei um pequeno script para o diretório de leitura e escrevi um novo nome de console para o arquivo (exemplo: 'name.txt') e o texto no arquivo.
fonte
A maneira mais fácil é usar o readline-sync
Ele processa uma por uma entrada e sai.
por exemplo:
fonte
require
declaração. Não há razão para deixar de fora.