Como posso detectar se meu arquivo Node.JS foi chamado usando SH: node path-to-file
ou JS require('path-to-file')
:?
Este é o Node.JS equivalente à minha pergunta anterior no Perl: Como posso executar meu script Perl apenas se ele não foi carregado com require?
Respostas:
Consulte a documentação para isso aqui: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
fonte
require()
, mas talvez você possa fazê-lo importando o arquivo e depois executandoeval
nele, ou executandorequire('child_process').exec('node the_file.js')
es-main
pacote para verificar se um módulo foi executado diretamente.Existe outra maneira um pouco mais curta (não descrita nos documentos mencionados).
var runningAsScript = !module.parent;
Descrevi mais detalhes sobre como tudo isso funciona nos bastidores deste post do blog .
fonte
node script.js
mas nãocat script.js | node
. Dessa forma, funciona para ambos.Fiquei um pouco confuso com a terminologia usada nas explicações. Então eu tive que fazer alguns testes rápidos.
Eu descobri que estes produzem os mesmos resultados:
E para as outras pessoas confusas (e para responder diretamente à pergunta):
fonte
Assim como em Python, sempre me pego tentando lembrar como escrever esse maldito trecho de código. Então, decidi criar um módulo simples para ele. Demorei um pouco para me desenvolver, pois o acesso às informações do módulo do chamador não é direto, mas foi divertido ver como isso poderia ser feito.
Portanto, a idéia é chamar um módulo e perguntar se o módulo chamador é o principal. Temos que descobrir o módulo da função de chamada. Minha primeira abordagem foi uma variação da resposta aceita:
Mas isso não garante que funcione.
module.parent
aponta para o módulo que nos carregou na memória, não aquele que está nos chamando. Se foi o módulo chamador que carregou esse módulo auxiliar na memória, tudo bem. Mas se não fosse, não teríamos como. Então, precisamos tentar outra coisa. Minha solução foi gerar um rastreamento de pilha e obter o nome do módulo do chamador a partir daí:Agora podemos fazer:
Ou mais legível:
Impossível de esquecer :-)
fonte
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
Tente isso se você estiver usando os módulos ES6:
fonte
process.mainModule
éundefined