Eu tenho um servidor Web escrito em Node.js e gostaria de iniciar com uma pasta específica. Não sei como acessar argumentos em JavaScript. Estou executando o nó assim:
Aqui server.jsestá o código do meu servidor. A ajuda do Node.js diz que isso é possível:
Método Padrão (sem biblioteca)
Os argumentos são armazenados em process.argv
Aqui estão os documentos do nó sobre como lidar com argumentos de linha de comando:
process.argvé uma matriz que contém os argumentos da linha de comando. O primeiro elemento será 'node', o segundo elemento será o nome do arquivo JavaScript. Os próximos elementos serão quaisquer argumentos adicionais da linha de comando.
O que devo digitar no prompt de comando para executar um script node.js com argumentos de linha de comando?
ATUALIZAÇÃO: Encontrei a resposta para a pergunta acima. stackoverflow.com/questions/12925802/…
Minimist é uma grande e simples analisador de argumento
— Guilherme Nagatomo
Você também pode acessar um único argumento quando você sabe sua posição: process.argv[n]onde né o índice baseado em zero
o segundo elemento (process.argv [1]) pode ser ou não ser o arquivo js. A sintaxe do comando do nó é node [options] [ -e script | script.js ] [arguments]ou node debug script.js [arguments]. por exemplo: node --harmony script.js balalaou node --no-deprecation --enable-ssl2 script.js balala, podemos usar process.execArgv com process.argv
Para normalizar os argumentos como uma função javascript regular receberia, eu faço isso nos meus scripts de shell node.js.
Apenas uma observação de que escrevi essa resposta há 4 anos e o código que estou executando ainda está funcionando 100% bem hoje. Ainda mantendo-se atualizado com as versões mais recentes do nó e ainda com zero problemas: é apenas um simples script de shell pessoal. Não faz parte de um grande objeto global cheio de bibliotecas JS. Eu ainda estou por trás da minha resposta hoje. Vou dar outra atualização em mais 4 anos.
@cuixiping mas o execArgvsão não no argvmodo que o 2 é o suficiente
— Tommi Kyntola
Depois de analisar o histórico de edições desta resposta, gostaria de um momento para simpatizar com @MauvisLedford. Não há nada tão irritante quanto edições não solicitadas no seu código em nome da preferência pessoal (sem benefícios quantificáveis, para inicializar). Para quem faz isso: jogue fora.
Hey @MauvisLedford já faz mais quatro anos. Eu adoraria uma atualização!
— andrew lorien 23/05/19
NÃOprocess.argv.splice(process.execArgv.length + 2) : para um comando node --harmony script.js --version, o process.argvé ['/usr/local/bin/node', 'script.js', '--version']. As bandeiras NÃOnode estão incluídas ! process.argv
A resposta correta atualizada para isso é usar a biblioteca minimista . Costumávamos usar otimista de nós, mas ele foi descontinuado.
Aqui está um exemplo de como usá-lo, retirado diretamente da documentação minimista:
Na verdade, esta solução é mais útil para o desenvolvimento de ferramentas de linha de comando com mais sinalizadores e argumentos e deve ser votada mais IMHO.
— JK ABC #:
Imo, esta é uma alternativa mais simples para npmjs.com/package/command-line-args #
— klodoma
@JKABC Eu não chamaria isso de a resposta mais correta, pois o OP apenas pede para acessar informações triviais da linha de comando. Mas concordo que os argumentos minimista e de linha de comando são muito úteis se você estiver planejando estender sua CLI.
— Justus Romijn 10/09
Eu me pergunto por que o '-n5' não produz 'n5: true' - isso faria sentido para mim.
@ MaxWaterman: porque as opções que começam com um único traço são apenas para um único caractere. Tudo o que segue uma única opção char é usado como argumento para a opção (não é necessário espaço). Iniciar a opção com dois hífens (ie --n5) deve produzir 'n5: true'. Esse é um comportamento bastante padrão para a maioria das ferramentas de linha de comando Unix (mas nem todas infelizmente).
Resposta de 2018 com base nas tendências atuais em estado selvagem:
Análise de argumento javascript de baunilha:
Pacotes NPM mais usados ​​para análise de argumento:
Minimista : Para análise mínima de argumentos.
Miau : alternativa mais leve ao Commander.js
Yargs : Análise de argumento mais sofisticada (pesada).
Vorpal.js : aplicativos de linha de comando maduros / interativos com análise de argumento.
"$ npm install -g yargs" gerou 1,9 MB de código JavaScript. Quando essa loucura terminará quando uma biblioteca de analisadores argv precisar de dois megabytes de código? Superfície aumentada ataque, RAM desperdiçado etc ...
Yargs é uma ferramenta maior que também analisa argumentos de linha de comando. Sem loucura, apenas falta de informação. Se você quiser algo mais leve, use o JS, Meow ou Minimist bruto.
"$ npm i yargs" -> 800 KB aqui, acho que os proprietários de pacotes finalmente aprenderam a ignorar arquivos irrelevantes. De qualquer forma, ainda grande para projetos bobos, mas pequeno quando você precisa de robustez e em projetos maiores que você já tem dependências ..
Criei um pacote, chamado wily-cli , com o objetivo de tornar uma ferramenta mais poderosa, mais personalizável e mais fácil de usar do que os grandes nomes listados. Para aqueles de vocês que estão interessados, são apenas 94,6 KB na instalação
O custo de importação do vscode me diz que yargs (159.2K) agora é realmente mais leve que o miado (180.2K). O Minimist ainda os vence em 3.4K!
Otimista (otimista de nós)
O Optimist está obsoleto. Tente yargs, que é um garfo ativo de otimista.
+1 para o link. Há uma lista bastante longa de analisadores de opção de linha de comando no github.com/joyent/node/wiki/modules#wiki-parsers-commandline
Minimista é outro sucessor do otimista agora obsoleto. É "a coragem do analisador de argumentos otimista sem toda a decoração fantasiosa". 23 milhões de downloads no último mês (em 12/2015).
Várias ótimas respostas aqui, mas tudo parece muito complexo. Isso é muito semelhante ao modo como os scripts bash acessam os valores dos argumentos e já é fornecido como padrão no node.js, como o MooGoo apontou. (Apenas para torná-lo compreensível para alguém novo no node.js)
— Paul van Jaarsveld
Funciona muito bem para definir suas opções, ações e argumentos. Ele também gera as páginas de ajuda para você.
Funciona muito bem para obter informações do usuário, se você gosta da abordagem de retorno de chamada.
Funciona muito bem para obter informações do usuário, se você gosta da abordagem do gerador.
@Evan Carroll, por favor, não edite minha resposta para promover uma biblioteca. Não uso stackoverflow.com/posts/7483600/revisions, especialmente por causa de um recurso ausente que você procura, essas opiniões devem ser salvas para comentários ou receber solicitações para os autores do módulo, não as edições de outras pessoas.
Commander.js realmente me ajudou. Outras bibliotecas não funcionariam com o compilador nexe, mas esta funciona. Se você deseja obter argumentos ao usar o nexe, certifique-se de passar -f para o compilador nexe.
Nenhum Libs com sinalizadores formatados em um objeto simples
Como algumas bandeiras têm um formato longo, você pode explicar isso. Em vez de = longArg[1]você poderia escrever = longArg.length > 1 ? longArg[1] : true;Isso iria deixá-lo passar este tipo de argumento:node config/build.js --flag1 --flag2
— tralston
Eu gosto disso. Isso fez a linha um pouco longa, então eu terminei. Obrigado por me contar sobre isso.
A maneira mais fácil de analisar argumentos da linha de comandos no NodeJS é usando o módulo stdio . Inspirado no getoptutilitário UNIX , é tão trivial quanto a seguir:
O opsobjeto será o seguinte:
As opções agrupadas também são suportadas, para que você possa escrever em -omvez de-o -m .
Além disso, stdiopode gerar uma saída de ajuda / uso automaticamente. Se você ligar, ops.printHelp()obterá o seguinte:
A mensagem anterior é mostrada também se uma opção obrigatória não for fornecida (precedida pela mensagem de erro) ou se for especificada incorretamente (por exemplo, se você especificar um único argumento para uma opção e ela precisar de 2).
— sgmonda
De acordo com os TOS da SO, vale mencionar que @sgmonda é o único mantenedor do módulo;) Bom e pequeno módulo, no entanto. Definitivamente útil.
— Qix - MONICA FOI ERRADA EM 27/01
Realmente útil, embora a atualização mais recente tenha sido em 30 de dezembro de 2014. Pode não ser tão bem mantida quanto alguns outros pacotes.
boa lib! tks! apesar de estar sem atualizações recentes .. Ele tem uma funcionalidade suficiente
— Pablo Ezequiel
Já faz um tempo, mas eu acabei de lançar a versão 2, com total promessa e suporte para texto datilografado. :-)
— sgmonda 19/12/19
Se o seu script for chamado myScript.js e você quiser passar o nome e o sobrenome, 'Sean Worthington', como argumentos abaixo:
Então, dentro do seu script, você escreve:
— Sean H. Worthington
command-line-args vale uma olhada!
Para acessar os valores, primeiro crie uma lista de definições de opções descrevendo as opções que seu aplicativo aceita. A typepropriedade é uma função setter (o valor fornecido é passado por isso), fornecendo controle total sobre o valor recebido.
Em seguida, analise as opções usando commandLineArgs () :
options agora se parece com isso:
Sintaxe baseada em comando (estilo git) no formato:
Sintaxe de comando e subcomando (estilo docker) no formato:
Um guia de uso (normalmente impresso quando --helpdefinido) pode ser gerado usando o uso da linha de comando . Veja os exemplos abaixo e leia a documentação para obter instruções sobre como criá-los.
O guia de uso do polímero-cli é um bom exemplo da vida real.
Há muito mais para aprender, consulte o wiki para exemplos e documentação.
@Loyd, isso está conectado ao problema já levantado - aqui . O Webstorm passa alguns argumentos adicionais.
@kboom esse problema foi resolvido pelas opções partiale stopAtFirstUnknown. Veja os documentos .
Existe um aplicativo para isso. Bem, módulo. Bem, mais de um, provavelmente centenas.
Yargs é um dos mais divertidos, seus documentos são legais de ler.
Aqui está um exemplo da página github / npm:
A saída está aqui (lê opções com traços, etc, curto e longo, numérico, etc.).
Aqui está minha solução 0-dep para argumentos nomeados:
Nota: Naturalmente, isso falhará quando o argumento contiver a =. Isso é apenas para uso muito simples.
— grebenyuksv
Provavelmente, é uma boa ideia gerenciar sua configuração de maneira centralizada usando algo como nconf https://github.com/flatiron/nconf
Ajuda a trabalhar com arquivos de configuração, variáveis ​​de ambiente, argumentos da linha de comando.
— 250R
E aqui está a configuração , minha própria interface mínima e somente leitura para o nconf.
sem librairies: usando Array.prototype.reduce ()
para este comando node index.js count=2 print debug=false msg=hi
por (muito mais tempo)
analisar automaticamente Boolean & Number
Sua versão mais longa tem um problema com cadeias que contêm pontos.
Solução inteligente! E se eu quiser suportar as opções de linha de comando counte c( ccomo um apelido / atalho para count)?
Isso é lindo! Mas ele não usa o padrão "um traço para uma chave de letra e dois traços para chave de palavra". Infelizmente, minha alternativa é muito longa e feia para postar aqui, então adicionarei como uma resposta diferente.
— Isacvale
Passar, analisar argumentos é um processo fácil. O Node fornece a propriedade process.argv, que é uma matriz de cadeias, que são os argumentos que foram usados ​​quando o Node foi chamado. A primeira entrada da matriz é o executável do Nó e a segunda entrada é o nome do seu script.
Se você executar o script com os argumentos abaixo
Arquivo: args.js
Você terá uma matriz como
— Piyush Sagar
Se você deseja executar algo como isto:
Este repositório não está mais disponível no github.
— steadweb
0 : O diretório do node.exe na sua usinagem (C: \ Arquivos de Programas \ nodejs \ node.exe ')
1: O diretório do seu arquivo de projeto. (proj.js)
seus argumentos reais iniciam o 2ndíndice do argvarray, ou seja process.argv[2].
Você pode acessar argumentos da linha de comando usando system.args. E eu uso a solução abaixo para analisar argumentos em um objeto, para que eu possa obter qual deles quero pelo nome.
agora você não precisa conhecer o índice do argumento. use-o comoargs.whatever
Nota: você deve usar argumentos nomeados como file.js x=1 y=2para usar esta solução.
— Evren Kutar
Não é possível fazê-lo funcionar, a mappropriedade é indefinida.
— caram 03/02
arquivo: parse-cli-argument.js:
Do que apenas:
Se você quiser fazer isso no JS / ES6 de baunilha, poderá usar a seguinte solução
trabalhou apenas em NodeJS> 6
produzirá o seguinte resultado
ps Corrija o código no mapa e reduza a função se encontrar uma solução mais elegante, obrigado;)
eu concordo, mas poderia ser mais curto não? let args = process.argv.slice(2).reduce((acc, arg) => { let [k, v] = arg.split('=') acc[k] = v return acc }, {})
— Joseph Merdrignac 13/10
Embora as respostas acima sejam perfeitas e alguém já tenha sugerido yargs, usar o pacote é realmente fácil. Este é um pacote interessante que facilita a transmissão de argumentos para a linha de comando.
Visite https://yargs.js.org/ para obter mais informações.
— Akshay Rajput
Yargs não afeta como os argumentos são transmitidos na linha de comando, apenas ajuda na leitura deles no código.
Passar argumentos é fácil, e recebê-los é apenas uma questão de ler o processo.argv array O Node torna acessível de qualquer lugar, basicamente. Mas com certeza você deseja lê-los como pares de chave / valor, portanto precisará de um pedaço de script para interpretá-lo.
Joseph Merdrignac postou um belo usando o método reduzir, mas contava com uma key=valuesintaxe em vez de -k valuee --key value. Eu o reescrevi muito mais feio e mais longo para usar esse segundo padrão, e vou publicá-lo como resposta, porque ele não se encaixa como um comentário. Mas faz o trabalho.
Com esse código, um comando node script.js alpha beta -charlie delta --echo foxtrotforneceria o seguinte objeto
A maneira mais simples de recuperar argumentos no Node.js é através da matriz process.argv. Este é um objeto global que você pode usar sem importar nenhuma biblioteca adicional para usá-lo. Você simplesmente precisa passar argumentos para um aplicativo Node.js., como mostramos anteriormente, e esses argumentos podem ser acessados ​​no aplicativo por meio da matriz process.argv.
O primeiro elemento da matriz process.argv sempre será um caminho do sistema de arquivos apontando para o nó executável. O segundo elemento é o nome do arquivo JavaScript que está sendo executado. E o terceiro elemento é o primeiro argumento que foi realmente passado pelo usuário.
Tudo o que esse script faz é percorrer a matriz process.argv e imprimir os índices, juntamente com os elementos armazenados nesses índices. É muito útil para depuração se você questionar quais argumentos você está recebendo e em que ordem.
Você também pode usar bibliotecas como yargs para trabalhar com argumentos de linha de comunicação.
— Rubin bhandari
Solução TypeScript sem bibliotecas:
Entrada: ts-node index.js -p param --parameter parameter
Resultado: { p: 'param ', parameter: 'parameter' }
— Robert Molina
process.argvé seu amigo, a captura de argumentos de linha de comando é suportada nativamente no Nó JS. Veja o exemplo abaixo:
— bhwp
conforme indicado nos documentos do nó A propriedade process.argv retorna uma matriz que contém os argumentos da linha de comandos passados ​​quando o processo Node.js. foi iniciado.
Ativando o processo Node.js como:
A maioria das pessoas deu boas respostas. Eu também gostaria de contribuir com algo aqui. Estou fornecendo a resposta usando a lodashbiblioteca para iterar todos os argumentos da linha de comando que transmitimos ao iniciar o aplicativo:
Para executar o código acima, basta executar os seguintes comandos:
— S.Mishra
A melhor maneira de passar argumentos de linha de comando para um programa Node.js. é usando uma interface de linha de comando (CLI)
Existe um módulo npm bacana chamado nodejs-cli que você pode usar.
Se você deseja criar um sem dependências, eu tenho um no meu Github, se você quiser conferir, é realmente muito simples e fácil de usar, clique aqui .