Node.JS: 通过 require 或从命令行使模块可运行
Node.JS: Make module runnable through require or from command line
我有一个脚本 setupDB.js
,它 运行 是异步的,旨在从命令行调用。最近,我在我的项目中添加了测试用例,其中一些需要设置数据库(因此需要执行上述脚本)。
现在,我想知道脚本何时完成它的工作。目前,在开始测试之前,我只是在要求 setupDB.js
之后等待几秒钟,这显然是个坏主意。
简单地导出带有回调参数的函数的问题在于,脚本可以 运行 没有任何开销很重要,这意味着没有命令行参数,没有额外的函数调用等,因为它是更大构建过程的一部分。
您对更好的方法有什么建议吗?
我现在是这样处理的:我导出一个执行设置的函数。一开始我检查是否从命令行调用了脚本,如果是,我简单地调用函数。同时,我也可以直接从另一个模块调用它,并传递一个回调。
if (require.main === module) {
// Called from command line
runSetup(function (err, res) {
// do callback handling
});
}
function runSetup(callback) {
// do the setup
}
exports.runSetup = runSetup;
我最近也在找这个,遇到一个somewhat-related问题:“Node.JS:检测是通过require调用还是直接通过命令行调用
”,它有 an answer 帮助我在几分钟前构建了类似下面的东西,其中导出只有 运行 如果它被用作模块,并且只需要 CLI 库如果 运行 作为脚本。
function doSomething (opts) {
}
/*
* Based on
*
*/
function isScript () {
return require.main && require.main.filename === /\((.*):\d+:\d+\)$/.exec((new Error()).stack.split('\n')[ 2 ])[ 1 ]
}
if (isScript) {
const cli = require('some CLI library')
opts = cli.parseCLISomehow()
doSomething(opts)
} else {
module.exports = {
doSomething
}
}
可能出于某种原因这不是一个好主意,但我不是专家。
make-runnable npm 模块可以帮助解决这个问题。
我有一个脚本 setupDB.js
,它 运行 是异步的,旨在从命令行调用。最近,我在我的项目中添加了测试用例,其中一些需要设置数据库(因此需要执行上述脚本)。
现在,我想知道脚本何时完成它的工作。目前,在开始测试之前,我只是在要求 setupDB.js
之后等待几秒钟,这显然是个坏主意。
简单地导出带有回调参数的函数的问题在于,脚本可以 运行 没有任何开销很重要,这意味着没有命令行参数,没有额外的函数调用等,因为它是更大构建过程的一部分。
您对更好的方法有什么建议吗?
我现在是这样处理的:我导出一个执行设置的函数。一开始我检查是否从命令行调用了脚本,如果是,我简单地调用函数。同时,我也可以直接从另一个模块调用它,并传递一个回调。
if (require.main === module) {
// Called from command line
runSetup(function (err, res) {
// do callback handling
});
}
function runSetup(callback) {
// do the setup
}
exports.runSetup = runSetup;
我最近也在找这个,遇到一个somewhat-related问题:“Node.JS:检测是通过require调用还是直接通过命令行调用 ”,它有 an answer 帮助我在几分钟前构建了类似下面的东西,其中导出只有 运行 如果它被用作模块,并且只需要 CLI 库如果 运行 作为脚本。
function doSomething (opts) {
}
/*
* Based on
*
*/
function isScript () {
return require.main && require.main.filename === /\((.*):\d+:\d+\)$/.exec((new Error()).stack.split('\n')[ 2 ])[ 1 ]
}
if (isScript) {
const cli = require('some CLI library')
opts = cli.parseCLISomehow()
doSomething(opts)
} else {
module.exports = {
doSomething
}
}
可能出于某种原因这不是一个好主意,但我不是专家。
make-runnable npm 模块可以帮助解决这个问题。