我正在用Node写一个web应用程序。如果我有一些带有init函数的JS文件,我怎么从命令行调用这个函数呢?


当前回答

灵感来自https://github.com/DVLP/run-func/blob/master/index.js

我创建了https://github.com/JiangWeixian/esrua

如果文件index.ts

export const welcome = (msg: string) => {
  console.log(`hello ${msg}`)
}

你就跑

esrua ./index.ts welcome -p world

将输出hello world

其他回答

有时你想通过CLI运行一个函数,有时你想从另一个模块请求它。以下是如何做到这两点。

// file to run
const runMe = () => {}
if (require.main === module) {
  runMe()
} 
module.exports = runMe

这个有点脏,但很好用:)

我将从脚本中调用main()函数。以前我只是在脚本的末尾调用main。然而,我确实添加了一些其他函数并将它们从脚本中导出(在代码的其他部分使用函数)-但我不想每次在其他脚本中导入其他函数时都执行main()函数。

所以我这样做了, 在我的脚本中,我删除了对main()的调用,而不是在脚本的末尾,我把这个检查:

if (process.argv.includes('main')) {
   main();
}

所以当我想在CLI中调用这个函数时:node src/myScript.js main

不评论你为什么想这样做,或者什么可能是更标准的做法:这里是你的问题的解决方案....请记住,命令行所需的引号类型可能会有所不同。

在你的db.js中,导出init函数。有很多方法,比如:

    module.exports.init = function () {
      console.log('hi');
    };

然后像这样调用它,假设你的db.js和你的命令提示符在同一个目录下:

node -e 'require("./db").init()'

如果你的db.js是一个模块db.js。Mjs,使用动态导入加载模块:

node -e 'import("./db.mjs").then( loadedModule => loadedModule.init() )'

对于其他读者来说,OP的init函数可以被称为任何东西,这并不重要,这只是问题中使用的特定名称。

如果你想从你的。env文件中包含环境变量,你可以使用env-cmd:

npx env-cmd node -e 'require("./db").init()'

如果你想在文件中运行一个特定的函数,使用run-func:

npx env-cmd npx run-func db.js init someArg

或者,为已接受的答案提供一个参数,你必须这样做:

npx env-cmd node -e 'require("./db").init(someArg)'

在这里编写/更新表达式比为命令提供不同的参数更不显式(例如,当你回头检查时更容易错过),所以我建议使用env-cmd和run-func。

注意:必要时,我通常还会在后面加上——experimental-modules。

你也可以用类似于@LeeGoddard answer的ts-node运行TypeScript。 在我的例子中,我想分别使用app和init进行测试。

// app.ts

export const app = express();

export async function init(): Promise<void> {
   // app init logic...
}
npx ts-node -e 'require("./src/app").init();'
npx ts-node -e 'import("./src/app").then(a => a.init());' // esmodule