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


当前回答

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

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

其他回答

make-runnable试试。

在db.js中,添加require('make-runnable');直到最后。

现在你可以做:

node db.js init

任何进一步的参数都将以列表或键值对的形式传递给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。

2022年更新-如果你已经切换到ES模块,你不能使用require技巧,你需要使用动态导入:

node -e 'import("./db.js").then(dbMod => dbMod.init());'

或者使用——experimental- specification -resolution=节点标志:

node --experimental-specifier-resolution=node -e 'import("./db").then(dbMod => dbMod.init());'

你也可以用类似于@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

如果你的文件只包含你的函数,例如:

myFile.js:

function myMethod(someVariable) {
    console.log(someVariable)
}

像这样从命令行调用它什么也不会发生:

node myFile.js

但是如果你改变你的文件:

myFile.js:

myMethod("Hello World");

function myMethod(someVariable) {
    console.log(someVariable)
}

现在这将从命令行工作:

node myFile.js