Electron中启动node服务

news2024/10/5 14:00:05

记一次遇到的问题,我们知道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.coloradmin.cn/o/705356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React | 再战Redux

✨ 个人主页:CoderHing 🖥️ React.js专栏:React.js 再战Redux 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 7天学会微信小程序 Node专栏…

chatgpt赋能python:下载Python的方法及使用指南

下载Python的方法及使用指南 Python是一种高级编程语言,被广泛应用于各种领域。如果你是一名程序员或者对编程有兴趣,那么学习Python会是一个不错的选择。本文将介绍Python的下载方法,并提供使用Python的基础指南。 Python的下载方法 Pyth…

Istio与Mcp Server服务器讲解与搭建演示

01Istio与外部注册中心 Istio为何需要对接外部注册中心 Istio 对 Kubernetes 具有较强的依赖性: 1.服务发现就是基于 Kubernetes 实现的,如果要使用 Istio,首先需要迁移到 Kubernetes 上,并使用 Kubernetes 的服务注册发现机制…

【数据挖掘】时间序列教程【二】

2.4 示例:颗粒物浓度 在本章中,我们将使用美国环境保护署的一些空气污染数据作为运行样本。该数据集由 2 年和 5 年空气动力学直径小于或等于 3.2017 \(mu\)g/m\(^2018\) 的颗粒物组成。 我们将特别关注来自…

认识GCC

GNU GNU是Linux系统下的一些工具包,GNU是GNU is Not Unix的缩写,因为当年Unix收费后,理查德马修斯托曼打算做一套GNU操作系统,当时GNU的工具包已经写好,就差内核即可组装成一个完整的操作系统,正好Linux写…

跨链 vs 多链

跨链 dApp 可以在部署在多个不同区块链上的多个不同智能合约上运行,而多链 dApp 则可以在不同网络上以多个单独的版本部署。 由于对区块空间的需求不断增加,Web3 应用层现在存在于数百个不同的区块链、二层网络和应用链上。这种现实催生了两个新术语——…

【教程】解决php微擎中的goto加密解密,一键解密工具

今天,我将向大家揭秘一款神奇的工具——goto解密工具,轻松解密这个看似棘手的问题。 无数开发者都曾因为php中的goto功能而头疼不已。goto解密工具其中之一就是解密goto代码。通过精妙的算法和强大的解析能力,它能够解密被goto加密的代码段&…

Vue项目设置网站小徽标

一、预期效果 自定义Vue项目的网站小徽标,用于显示网站的logo,效果大致如下 二、制作 .ico文件 2.1 打开比特虫官网 比特虫官网:https://www.bitbug.net/ 2.2 操作步骤如图 三、引入Vue项目 3.1 将生成的 .ico文件放入我们的 Vue 项目 3.…

servlet+JSP与SpringBoot+Vue项目交互——servlet请求SpringBoot接口

问题 servletJSP与SpringBootVue项目交互——servlet请求SpringBoot接口 详细问题 笔者前一段时间开发一个项目,使用的技术框架是servletJSP,现阶段开发的项目技术框架为SpringBootVue,笔者现在需要输入servletJSP请求SpringBoot接口&…

C语言编程—递归

递归指的是在函数的定义中使用函数自身的方法。 举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚&…

2024考研408-计算机组成原理第六章-总线学习笔记

文章目录 前言初识总线一、总线概述1.1、总线的概述1.1.1、认识总线1.1.2、设计总线需要的特性1.1.3、总线的分类①按照数据传输格式分(串行、并行)②按照总线功能连接的总线(片内总线、系统总线、通信总线)③按照时序控制方式&am…

css新特性(五)

css基础(一)css基础(一)_上半场结束,中场已休息,下半场ing的博客-CSDN博客Emmet语法Emmet语法_上半场结束,中场已休息,下半场ing的博客-CSDN博客css基础(二)c…

Retrofit注解

1. 注解类型 Retrofit路径结合的规则 2. 网络请求方法 2.1 Get请求 完整地址:http://mock-api.com/2vKVbXK8.mock/getUserInfo?iduserid 2.1.1 Query 创建Retrofit实例必须传入baseurl(http://mock-api.com/2vKVbXK8.mock/),在GET("getUserIn…

Android跨平台语言分析

跨平台技术发展的三个阶段 第一阶段是混合开发的web容器时代 为了解决原生开发的高成本、低效率,出现了Hybrid混合开发原生中嵌入依托于浏览器的WebViewWeb浏览器中可以实现的需求在WebView中基本都可以实现但是Web最大的问题是,它的性能和体验与原生开发…

Mybatis面试题--MyBatis执行流程

首先我们知道Mybatis是目前最流行的持久层框架,当我们了解了执行流程,可以让我们理解各个组件的关系,以及Sql的执行过程(参数映射、sql解析、执行和结果处理) 1首先我们需要读取框架的核心配置文件 2接下来我们就要去操…

chatgpt赋能python:Python编程的好玩儿之处:介绍几个有趣的Python程序

Python编程的好玩儿之处:介绍几个有趣的Python程序 Python已经成为了一种非常受欢迎的编程语言,除了其在Web开发和数据科学领域的应用,它还能够完成很多好玩儿的事情!接下来,我将介绍几个有趣的Python程序&#xff0c…

【零基础入门学习Python---Python多线程和多进程】

🚀 Python 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

基于SpringBoot+vue前后端分离的相机销售系统

文章目录 项目介绍主要功能截图:首页相机详情个人中心 部分代码展示设计总结项目获取方式 🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你…

Centos7.9 磁盘分区、挂载

常用命令: fdisk /dev/vdb 创建分区 mkfs.ext2 /dev/vdb3 文件系统(ext2,ext4,xfs)格式化 mkfs.ext4 /dev/vdb3 mkfs.xfs /dev/vdb3 df -T 命令查看格式化是否成功(要先把分区挂载到目录,否则df…

18. WebGPU 计算着色器

本文接续基础知识文章。我们将从一些基本的计算着色器开始&#xff0c;然后希望继续讨论解决现实世界问题并写一些示例。 在上一篇文章中&#xff0c;制作了一个非常简单的计算着色器&#xff0c;可以将数字加倍。 这是着色器 group(0) binding(0) var<storage, read_wri…