代码之家  ›  专栏  ›  技术社区  ›  Takeshi Tokugawa YD

“process.send”在父和子Node.js进程中均未定义(使用了“childProcess.spawn”变量)

  •  0
  • Takeshi Tokugawa YD  · 技术社区  · 5 年前

    我想提供主应用程序和子电子应用程序之间的数据交换(GUI可以从控制台启动)。

    下面的源代码是TypeScript。

    import Path from "path";
    import ChildProcess, { ChildProcess as ChildProcess__type } from "child_process";
    import Chalk from "chalk";
    
    
    export default abstract class ProjectInitializer {
    
      private static readonly ELECTRON_EXECUTE_FILE_ABSOLUTE_PATH: string = Path.resolve(
          __dirname, "node_modules", ".bin", "electron.cmd"
      );
      private static readonly ELECTRON_MAIN_PROCESS_FILE_ABSOLUTE_PATH: string = Path.resolve(
          __dirname, "ProjectInitializer__ElectronMainProcess.js"
      );
    
    
      public static startInitializeProjectGUI(): void {
    
        console.log(Chalk.cyanBright("GUI is starting ..."));
    
        const electronApplicationChildProcess: ChildProcess__type = ChildProcess.spawn(
            ProjectInitializer.ELECTRON_EXECUTE_FILE_ABSOLUTE_PATH,
            [
              ProjectInitializer.ELECTRON_MAIN_PROCESS_FILE_ABSOLUTE_PATH,
              "--color", "always"
            ]
        );
    
        // No TypeScript error but error occurs in compiled JavaScript
        electronApplicationChildProcess.send({ foo: "alpha" });
    
        electronApplicationChildProcess.on("message", (message: unknown) => {
          console.log(message);
        });
      }
    }
    

    JavaScript错误消息是:

    TypeError: electronApplicationChildProcess.send is not a function
        at Function.ProjectInitializer.startInitializeProjectGUI (webpack:///./ProjectInitializer/ProjectInitializer.ts?:24:41)
        at Function.HikariAutomation.interpretConsoleCommandAndExecute
    

    子过程(但在电子术语中,它是“电子主过程”)

    import URL from "url";
    import Path from "path";
    
    import {
      app as electronApplication,
      App as ElectronApplication,
      BrowserWindow,
    } from "electron";
    import enableElectronDebug from "electron-debug";
    
    
    class ProjectInitializerGUI {
    
      private electronApplication: ElectronApplication;
      private mainWindow: BrowserWindow | null = null;
    
      private static MAIN_WINDOW_MARKUP__FILE_NAME_WITH_EXTENSION: string = 'ProjectInitializer.html';
    
    
      private constructor() {
    
        this.electronApplication = electronApplication;
        enableElectronDebug();
    
        this.electronApplication.on('ready', this.onApplicationReadyEventHandler.bind(this));
      }
    
      public static start(): void {
        new ProjectInitializerGUI();
      }
    
    
      private onApplicationReadyEventHandler(): void {
    
        this.mainWindow = new BrowserWindow({
          width: 1280,
          height: 800,
          useContentSize: true,
          center: true,
          resizable: false,
          fullscreenable: false,
          titleBarStyle: 'hidden',
          webPreferences: {
            nodeIntegration: true
          }
        });
    
        this.mainWindow.loadURL(URL.format({
          pathname: Path.join(
              __dirname,
              ProjectInitializerGUI.MAIN_WINDOW_MARKUP__FILE_NAME_WITH_EXTENSION
          ),
          protocol: 'file:',
          slashes: true
        }));
    
        this.mainWindow.setMenu(null);
      }
    }
    
    
    (function executeApplication(): void {
    
      ProjectInitializerGUI.start();
    
      process.on("message", (message: unknown) => {
        console.log(message);
      });
    
      // TypeScript forces to check send method on existence ...
      if (process.send) {
        // but because it's undefined, code in this scope in unreachable
        process.send("Just message");
        process.send({ foo: "alpha", bar: "bravo" })
      }
    })();
    

    以下是的类型定义 process.send . 如您所见,它是可选属性:

    interface Process extends EventEmitter {
      // ...
      send?(message: any, sendHandle?: any, options?: { swallowErrors?: boolean}, callback?: (error: Error | null) => void): boolean;
      // ...
    

    定义 child_process send 方法始终存在于子进程的类型定义中 子进程 发送 属性是必需的:

    declare module "child_process" {
    
      // ...
    
      interface ChildProcess extends events.EventEmitter {
        // ...
        send(message: any, callback?: (error: Error | null) => void): boolean;
      }
    }
    
    0 回复  |  直到 5 年前