Tengo un servidor Express esperando que mi sitio web haga algo. Cuando mi sitio hace algo, se debe llamar a un script de shell en el servidor Express. El problema es: el script de shell solo se ejecuta después de que se haya aceptado o denegado la "ventana de confirmación". Quiero que la recuperación ocurra lo antes posible. Ni siquiera necesitaría obtener nada del servidor Express, solo quiero indicarle a Express que ejecute el script de shell lo antes posible.
Tengo este código en el sitio web:
messaging.onMessage(function (payload){ fetch("http://localhost:9000/testAPI") .then(res => res.text()) .then(res => console.log("something:" + res)); var r = confirm(callingname + " is calling."); if (r == true) { window.open(payload.data.contact_link, "_self"); } else { console.log("didn't open"); } });Tengo este código en el backend:
var express = require("express"); var router = express.Router(); router.get("/", function(req,res,next){ const { exec } = require('child_process'); exec('bash hi.sh', (error, stdout, stderr) => { console.log(stdout); console.log(stderr); if (error !== null) { console.log(`exec error: ${error}`); } }); res.send("API is working"); }); module.exports = router;confirm() está bloqueando, y solo tiene un hilo. Esto significa que confirm() detendrá el mundo para su aplicación, evitando que fetch() haga algo.
Como la solución más simple posible, puede intentar retrasar el momento en que se invoca confirm() . Esto permitiría que fetch() obtenga la solicitud.
messaging.onMessage(function (payload) { fetch("http://localhost:9000/testAPI") .then(res => res.text()) .then(text => console.log("something:" + text)); setTimeout(function () { if (confirm(`${callingname} is calling.`)) { window.open(payload.data.contact_link, "_self"); } else { console.log("didnt open"); } }, 50); }); Otras opciones serían poner confirm() en una de las devoluciones de llamada .then() de fetch, o usar una alternativa sin bloqueo para confirm() , como se sugiere en los comentarios.