Necesito poder ejecutar algún código que se bloqueará y algún otro código que luego, cuando se bloquee, iniciará otras acciones.
El caso de uso es el siguiente:
Tengo un archivo, llamado index.ts , que ejecuta un servidor express y socket
Tengo un archivo de prueba, llamado test.spec.ts , que debe poder iniciar el servidor express y luego iniciar algunos comandos para ejecutar pruebas a través de una solicitud HTTP o un mensaje de socket (preferiría HTTP)
La única forma que encontré para mantener vivo el servidor web es instanciarlo con
import { spawnSync } from 'child_process'; spawnSync('ts-node', ['path/to/index.ts"], { cwd: "path/to/workdir"});que se bloqueará hasta que se elimine el proceso secundario (podría ser hasta 30 minutos más tarde).
¿Hay alguna forma de dividirse en dos procesos, uno que se bloquee al iniciarlo y otro que siga funcionando y exponga algunas funciones para interacciones con el archivo de prueba?
Mi objetivo se vería así:
// index.ts import * as express from "express"; const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); }); // test.spec.ts import { spawnSync } from 'child_process'; describe("Test",()=>{ it("Test", async ()=>{ // create somehow a child process that should block const childProcess = ... childProcess.do(spawnSync('ts-node', ['path/to/index.ts'], {cwd: 'path/to/workdir'}) //should block now // the following code should run in parallel await new Promise(r => setTimeout(r, 5000)); //wait some time until the webserver is ready fetch('http://localhost:3000').then((ret)=>{ expect(ret,'to be Hello World').to.contain('Hello World!"); }) ... // more tests }); });Creo que encontré la razón y una posible solución yo mismo.
El nodo siempre se ejecuta en un solo proceso, por lo tanto, no puede funcionar. Afortunadamente pude descubrir un enfoque totalmente diferente. Instalé el npm-run-all y creé un nuevo script en mi archivo package.json llamado run-p script1 script2 . De esta manera, puedo ejecutar ambos en paralelo y el proceso con el servidor web permanece vivo hasta que se ejecutan todas las pruebas.