typescript 如何在node.js脚本中启动和停止服务器子进程

hc2pp10m  于 2022-12-30  发布在  TypeScript
关注(0)|答案(1)|浏览(178)

长话短说,我需要能够启动/停止node.js示例中的两个子进程。我正在为我的react/express应用程序编写测试,在测试中有一个部分我需要同时运行API服务器和react dev服务器,等待它们完全激活,然后使用它们执行一些操作。然后关闭这两个窗口并继续我的其余测试。
我已经研究了shelljschild_processconcurrently,但是我还没有找到一种优雅地退出这些进程的方法,我经常在脚本完全终止后挂起进程,或者脚本拒绝自己退出。
例如,下面是我尝试用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示例中将多个服务器作为子进程运行并正确关闭它们吗?

flvlnr44

flvlnr441#

如果启动脚本时服务器已经在运行,则Promise永远不会解析,脚本只是挂起:

// what if data value is 'error address already in use'? if condition
// will fails and promise is never resolve
if(data.indexOf('App listening on port') !== -1) {
    resolve(child)
}

如果服务器没有运行,您的代码应该可以工作,但我首先要确保Promise总是在搜索其他问题之前得到解决

相关问题