使用节点命令行连续执行javascript文件

时间:2019-01-24 09:05:09

标签: node.js bash

我有两个脚本来为项目设置数据库,文件需要连续运行,其中每个文件仅在前一个文件完成后才运行。

// A manual run from bash/terminal would look like this:
node ./db_init.js
node ./db_seed1.js
node ./db_import_data.js
node ./db_seed2.js

每个文件都是“执行自身”,如下所示:

// db_init.js
const initTables = async () => {
  await sequelize.sync({force: true})
}

initTables() // <--- self executing

有没有一种简单的方法可以连续运行所有4个文件,而每个文件都在等待上一个文件的完成。

问题的关键在于我想保持文件“自我执行”的“自我执行”性质,以便您仍然可以像node ./db_init.js

1 个答案:

答案 0 :(得分:2)

否,节点CLI没有任何选项可完全完成您想要的操作。 -r标志可能会关闭,但无法正确排序脚本。例如node -r ./db_init.js -r ./db_seed1.js ...将并行而不是连续运行所有脚本。

如果您更改每个脚本以导出其工作的承诺(例如,将行initTables()更改为module.exports = initTables()),则可以制作包装runScripts.js的脚本,如下所示:

(async () => {
    for (const script of process.argv.slice(2)) { // slice(2) chops off 'node', 'runScript.js'
        await require(script);
    }
})().catch(e => console.error(e))

然后像node ./runScripts.js ./db_init.js ./db_seed1.js ./db_import_data.js ./db_seed2.js

一样运行