javascript - Executar função em script a partir da linha de comando (Node JS)
Estou escrevendo um aplicativo web em Node. Se eu tiver algum arquivo JS db.js com uma função init nele, como eu poderia chamar essa função a partir da linha de comando?
Resposta #1
Sem comentários sobre por que você quer fazer isso, ou o que poderia ser uma prática mais padrão: aqui está uma solução para sua pergunta.... Tenha em mente que o tipo de aspas exigido pelo seu linha de comando pode variar.
No seu db.js, exporte a função init. Existem muitas maneiras, mas por exemplo:
module.exports.init = function () {
console.log('hi');
};
Então chame assim, assumindo que seu db.js esteja no mesmo diretório do seu prompt de comando:
node -e 'require("./db").init()'
Se o seu db.js fosse um módulo db.mjs, use uma importação dinâmica para carregar o módulo:
node -e 'import("./db.mjs").then( loadedModule => loadedModule.init() )'
Para outros leitores, a função init do OP poderia ter sido chamada de qualquer forma, isso não é importante, é apenas o nome específico usado na pergunta.
Resposta #2
Atualização 2020 - CLI
Como @mix3d apontou, você pode simplesmente executar um comando onde file.js é seu arquivo e someFunction é sua função, opcionalmente seguida por parâmetros separados por espaços
npx run-func file.js someFunction "just some parameter"
É isso.
file.js chamado no exemplo acima
const someFunction = (param) => console.log('Welcome, your param is', param)
// exporting is crucial
module.exports = { someFunction }
Descrição mais detalhada
Execute diretamente do CLI (global)
Instalar
npm i -g run-func
Uso, ou seja, execute a função "init", ela deve ser exportada, veja na parte inferior
run-func db.js init
ou
Executar a partir do script package.json (local)
Instalar
npm i -S run-func
Configuração
"scripts": {
"init": "run-func db.js init"
}
Uso
npm run init
Parâmetros
Quaisquer argumentos seguintes serão passados como parâmetros da função init(param1, param2)
run-func db.js init param1 param2
Importante
a função (neste exemplo init) deve ser exportada no arquivo que a contém
module.exports = { init };
ou exportação ES6
export { init };
Resposta #3
Conforme as outras respostas, adicione o seguinte em someFile.js
module.exports.someFunction = function () {
console.log('hi');
};
Você pode então adicionar o seguinte ao package.json
"scripts": {
"myScript": "node -e 'require(\"./someFile\").someFunction()'"
}
A partir do terminal, você pode então chamar
npm run myScript
Acho isso uma maneira muito mais fácil de lembrar os comandos e usá-los
Resposta #4
Tente tornar executável.
No db.js, adicione require('make-runnable'); ao final.
Agora você pode fazer:
node db.js init
Quaisquer argumentos adicionais seriam passados para o método init, na forma de uma lista ou pares chave-valor.
Resposta #5
Às vezes você quer executar uma função via CLI, às vezes você quer require ela a partir de outro módulo. Aqui está como fazer ambos.
// file to run
const runMe = () => {}
if (require.main === module) {
runMe()
}
module.exports = runMe
Resposta #6
Este aqui está sujo, mas funciona :)
Eu estarei chamando a função main() a partir do meu script. Anteriormente, eu apenas colocava chamadas para main no final do script. No entanto, eu adicionei algumas outras funções e as exportei do script (para usar as funções em outras partes do código) - mas eu não quero executar a função main() toda vez que eu importar outras funções em outros scripts.
Então eu fiz isso, no meu script eu removi a chamada para main(), e em vez disso no final do script coloquei esta verificação:
if (process.argv.includes('main')) {
main();
}
Então, quando eu quero chamar essa função no CLI: node src/myScript.js main
Resposta #7
maneira simples:
vamos supor que você tenha um arquivo db.js em um diretório helpers na estrutura do projeto.
agora vá para o diretório helpers e acesse o console do node
helpers $ node
2) requerer o arquivo db.js
> var db = require("./db")
3) chame sua função (no seu caso, é init())
> db.init()
espero que isso ajude
Resposta #8
Se você transformar db.js em um módulo, poderá requerê-lo a partir de db_init.js e apenas: node db_init.js.
db.js:
module.exports = {
method1: function () { ... },
method2: function () { ... }
}
db_init.js:
var db = require('./db');
db.method1();
db.method2();
Resposta #9
Atualizado para 2022 - Se você migrou para ES Modules, não pode usar os truques do require, será necessário usar imports dinâmicos:
node -e 'import("./db.js").then(dbMod => dbMod.init());'
ou com a flag --experimental-specifier-resolution=node:
node --experimental-specifier-resolution=node -e 'import("./db").then(dbMod => dbMod.init());'
