Pesquisa de site

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());'

Artigos relacionados