运行node服务,应用child_process管制子文件夹js文件执行

文件架构:

index.js 主程序入口fileHelper.js 文件夹遍历readjson->main.js 子文件夹可执行文件入口

package.json

{  "name": "nodelearn",  "version": "1.0.0",  "description": "",  "main": "src/index.js",  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1"  },  "keywords": [],  "author": "",  "license": "ISC"}

index.js

const { spawn } = require("child_process");const readline = require("readline");const rl = readline.createInterface({ input: process.stdin, output: process.stdout });const { loopFileSync } = require("./fileHelper");const entryFileName = "main.js";const stratys = [];//待执行办法let aheadMessages = [];//通用执行//获取所有可执行文件const files = loopFileSync(__dirname);files.forEach(item => {    const { fileName, fileDir, fileStat } = item;    if (fileName === entryFileName) {        let fileDirSplit = fileDir.split("\\");        if (fileDirSplit.length < 2) return;        stratys.push([fileDirSplit[fileDirSplit.length - 2], fileDir, fileStat]);    }})//进入用户抉择function execution(cb) {    console.clear();    let showMessage = "";    aheadMessages = [];    showMessage += "please select your choose.\n";    aheadMessages.push("0、exit\n");    aheadMessages.push("1、run lastest modify\n");    aheadMessages.push("2、run lastest create\n");    aheadMessages.push("3、run all\n");    showMessage += aheadMessages.join("");    stratys.forEach((item, index) => {        showMessage += `${index + aheadMessages.length}、${item[0]}\n`;    })    rl.question(showMessage, function (answer) {        cb(answer, () => {            rl.question("按回车键持续!", function () {                execution(cb);            })        });    })}function createNodeExecPromiseFactory(processName, jsFile) {    return new Promise((resolve) => {        let data = '';        let spawnObj = spawn("node ", [jsFile], { 'shell': true });        spawnObj.stdout.on("data", (chunk) => {            data += chunk.toString();        })        spawnObj.on("exit", () => {            console.log(`${new Date().toLocaleString()}-----开始执行工作:${processName}`);            console.log(data);            console.log(`${new Date().toLocaleString()}-----执行工作${processName}结束`);            resolve();        })    })}function handleExecution(choose, next) {    let chooseNum = Number(choose);    if (isNaN(chooseNum) || chooseNum < 0 || chooseNum > (stratys.length + aheadMessages.length - 1)) {        console.warn("抉择有误,请从新抉择!");        next();        return;    }    if (chooseNum == 0) {        console.log("Exit!");        rl.close();        process.exit(0);    }    console.clear();    let newStratys = [], promises = [];    switch (chooseNum) {        case 1: //按批改工夫排序,执行最新批改            newStratys = stratys.slice().sort((a, b) => {                return b[2].mtimeMs - a[2].mtimeMs;            })            promises.push(createNodeExecPromiseFactory(newStratys[0][0], newStratys[0][1]));            break;        case 2: //按创立工夫排序,执行最新创立            newStratys = stratys.slice().sort((a, b) => {                return b[2].ctimeMs - a[2].ctimeMs;            })            promises.push(createNodeExecPromiseFactory(newStratys[0][0], newStratys[0][1]));            break;        case 3://执行全副工作            newStratys = stratys;            for (let i = 0; i < newStratys.length; i++) {                promises.push(createNodeExecPromiseFactory(newStratys[i][0], newStratys[i][1]));            }            break;        default:            newStratys = stratys;            let _chooseNum = chooseNum - aheadMessages.length;            promises.push(createNodeExecPromiseFactory(newStratys[_chooseNum][0], newStratys[_chooseNum][1]));            break;    }    const p = Promise.all(promises);    p.then(() => {        console.log("执行所有工作结束!");        next();    })}execution(handleExecution);

fileHelper.js

const fs = require("fs");const path = require("path");function loopFile(filePath, cb) {    fs.readdirSync(filePath, function (err, files) {        if (err) {            console.warn(err)        } else {            files.forEach(function (filename) {                var filedir = path.join(filePath, filename);                fs.stat(filedir, function (eror, stats) {                    if (eror) {                        console.warn('获取文件stats失败');                    } else {                        var isFile = stats.isFile();                        var isDir = stats.isDirectory();                        if (isFile) {                            if (typeof cb === "function") cb(filename, filedir,fileStat);                        }                        if (isDir) {                            loopFile(filedir, cb);                        }                    }                })            });        }    });}function loopFileSync(filePath) {    const result = [];    function loop(filePath) {        let files = fs.readdirSync(filePath);        files.forEach(function (fileName) {            let fileDir = path.join(filePath, fileName);            let fileStat = fs.statSync(fileDir);            if (fileStat.isFile()) {                result.push({ fileDir, fileName,fileStat });            } else if (fileStat.isDirectory()) {                loop(fileDir);            }        });    }    loop(filePath);    return result;}exports.loopFile = loopFile;exports.loopFileSync = loopFileSync;

运行成果