长话短说,我需要能够启动/停止node.js示例中的两个子进程。我正在为我的react/express应用程序编写测试,在测试中有一个部分我需要同时运行API服务器和react dev服务器,等待它们完全激活,然后使用它们执行一些操作。然后关闭这两个窗口并继续我的其余测试。
我已经研究了shelljs
、child_process
和concurrently
,但是我还没有找到一种优雅地退出这些进程的方法,我经常在脚本完全终止后挂起进程,或者脚本拒绝自己退出。
例如,下面是我尝试用child_process
启动服务器的方法(有点笨拙),在继续之前等待它完成启动,然后尝试关闭它。
import { exec } from 'child_process'
const startNode = async () : Promise<ChildProcess> => {
/**
* Starts our backend api
*/
return new Promise((resolve, reject) => {
const child : ChildProcess | null = exec('npm run start:dev:norestart')
if(child === null || !child.stdout) return reject(null)
child.stdout.on('data', data => {
console.log(data)
if(data.indexOf('App listening on port') !== -1) {
resolve(child)
}
})
})
}
const doThing = async () => {
console.log('Start')
const child = await startNode()
child.kill('SIGKILL')
console.log('Finished')
}
doThing()
然而,与其他尝试过的解决方案类似,我的脚本永远不会退出,服务器也永远不会停止运行(我通过同时打开另一个终端来测试这一点,看看我是否可以运行,我得到了一个“错误地址已经在使用中”)。
有人知道如何在单个node.js示例中将多个服务器作为子进程运行并正确关闭它们吗?
1条答案
按热度按时间flvlnr441#
如果启动脚本时服务器已经在运行,则
Promise
永远不会解析,脚本只是挂起:如果服务器没有运行,您的代码应该可以工作,但我首先要确保Promise总是在搜索其他问题之前得到解决