Electron中启动node服务

news/2024/11/23 16:36:23/

记一次遇到的问题,我们知道Electron 中主进程是在node环境中,所以打算在node环境中再启动一个node服务。但是直接使用exec命令启动就会卡主。对应的代码如下

// 启动Node server
const startServer = async () => {try {console.log('开始启动node server');execSync('npm run server');console.log('成功启动node server')} catch (error) {console.log(`启动node server 失败:${error.message}`)}
}// electron 中的main.js
// 这段程序将会在 Electron 结束初始化
app.whenReady().then(async () => {createWindow()startServer()app.on('activate', () => {// 在 macOS 系统内, 如果没有已开启的应用窗口// 点击托盘图标时通常会重新创建一个新窗口if (BrowserWindow.getAllWindows().length === 0) createWindow()})// watchProtocol()
})

在electron 应用启动之后,会调用startServer方法,在这个方法中会使用exec执行npm run server命令,这个命令会启动一个koa的node 服务。然后启动electron
但是会发现electron应用的窗口没有正常打开,但这个node 服务已近启动起来了。并且可以正常提供接口服务
在这里插入图片描述

后来发现是应为使用了同步的命令导致的,只需要把execSync命令缓存exec或者是spawn就可以解决了。

// 启动Node server
const startServer = async () => {try {console.log('开始启动node server');// 使用spawn or exec来启动node服务//const serverProcess = spawn('node', ['startServer.js']);exec('npm run server');console.log('成功启动node server')} catch (error) {console.log(`启动node server 失败:${error.message}`)}
}

之所以同步的命令不行,改成异步的命令就可以。我想是因为在同步命令中,主进程创建的子进程会一直等待子进程的返回。如果子进程的返回很大,会把子进程的返回暂时存在内存中,直至子进程所有内容全部结束后一起返回给主进程。这是node 同步创建子进程的机制,但这里是启动一个服务,本身没有返回的内容。所以主进程就一直在等着子进程的返回。所以electron主进程就卡主了。而通过异步创建的子进程机制则不是这样。通过异步创建的子进程互已返回一个子进程的实例,在这个实例中有stdout、stderr这些标准输出和错误。主进程是通过监听这些事件来获取子进程中返回的信息。并且是子进程产生一部分信息就返回给主进程一部分信息。而不是主进程一直在等着子进程一起返回。所以这里就不会把主进程给阻塞住。主进程通过异步创建子进程获取子进程信息类似下面这样:

 const childProcess = spawn('node', ['startServer.js'])childProcess.stdout.on('data', (data) => {console.log(`stdout: ${data}`);});childProcess.stderr.on('data', (data) => {console.error(`stderr: ${data}`);});childProcess.on('close', (code) => {console.log(`child process exited with code ${code}`);}); 

http://www.ppmy.cn/news/669618.html

相关文章

兄弟HL2130打印机清零方法(绝对可用)

为什么80%的码农都做不了架构师?>>> 最后一句话的意思是说:松开go键——等2秒连按2次go键——关闭前盖后再连按6次,应该很清楚了吧, 转载于:https://my.oschina.net/xoyo/blog/161116

Scrapy框架之认识MongoDB

目录 MongoDB 简介 特点 MongoDB的适用场景 MongoDB的行业具体应用 如何抉择是否使用MongoDB MongoDB 简介 MongoDB 是免费开源的跨平台 NoSQL 数据库,命名源于英文单词 humongous,意思是「巨大无比」,可见开发组对 MongoDB 的定位。…

Linux训练营(文件和目录操作)

文章目录 前言一、ls命令二、cd命令三、mkdir命令四、cp命令五、rm命令总结 前言 本篇文章我们来讲解Linux中的文件和目录操作,在这里我们主要使用的是Linux中的命令来操作这些文件和目录,命令是Linux中最基础的部分。 一、ls命令 ls是一个常用的命令…

Spring bean 生命周期

在互联网领域中,Spring框架扮演着重要的角色。作为一个开源的Java应用程序开发框架,Spring提供了一种灵活而强大的方式来构建可扩展的应用程序。Spring框架中的一个重要概念是Bean,它是Spring应用程序的基本构建块之一。了解Spring Bean的生命…

【实战】 二、React 与 Hook 应用:实现项目列表 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表1.新建文件2.状态提升3.新建utils4.Custom Hook 学习内容来源:React React Hook TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.0…

使G900支持简体中文

替换 wince.nls 文件 默认地区设置为中国 导入目前网上流传的 SDKCert 和特权证书 使用微软雅黑字体 (10M 版) 设置任务栏始终显示时间 添加 GPRS 连接设置 (中移动 CMNET) 更改 MMS 设置 (中移动) 修复 X01HT 键位 增加联系人界面拼音查询 开启蓝牙立体声…

Samsung/三星GALAXY Round(G910) root教程_方法

Samsung/三星GALAXY Round(G910)的root教程在这里整理了一下,之前有机友说自己的手机想删除系统自带的一些无用软件,可是怎么也删除不了,所以需要先进行root才可以删除,不然的话是 删除不了的,这个方法也是大家在root过程中总结出来了,因为很多人都已经root过了,这次r…

玄铁C910总览

一、 开源玄铁C910简介 玄铁C910是由平头哥设计并开源的高性能CPU,基于开源的RISC-V指令集,主要面向对性能要求严格的边缘计算领域,如边缘服务器、边缘计算卡、高端机器视觉、高端视频监控、自动驾驶、移动智能终端、5G 基站等。 玄铁C910主…