A pedido, mi servidor debe ejecutar un comando cmd y un archivo deployment.js. Todo funciona bien, pero si agrego esta línea const { getSimpleMessage } = require('../src/server') obtengo el error de que el puerto 3000 ya está en uso. ¿Por qué está pasando esto?
Servidor.js:
app.post("/", (req,res) =>{ console.log("Get from /"); SimpleMessage = 'Hello world'; exec('npx hardhat run scripts/deploy.js --network goerli', (error, stdout, stderr) => { console.log(stdout); console.log(stderr); if (error !== null) { console.log("v error") console.log(`exec error: ${error}`); } }); res.send("Server received the request"); }); // starting the server app.listen(3000, () => { console.log('listening on port 3000'); });Implementar.js:
const { getSimpleMessage } = require('../src/server'); //THIS LINE CAUSES ERROR async function main() { const HelloWorld = await ethers.getContractFactory("HelloWorld"); // Start deployment, returning a promise that resolves to a contract object const hello_world = await HelloWorld.deploy("HelloWorld"); console.log("Contract deployed to address:", hello_world.address); } main() .then(() => process.exit(0)) .catch(error => { console.error(error); process.exit(1); });Ejecuto el archivo con el comando: node src/server.
Cuando el servidor se está ejecutando y recibe una POST / solicitud, implementa Deploy.js , lo que hace que el
app.listen(3000, ...) comando en server.js para ser ejecutado nuevamente, en otro proceso. Entonces habría dos procesos escuchando el puerto 3000, lo que conduce al error observado.
Tal vez necesite separar la función getSimpleMessage del archivo server.js .
Cuando ejecuta require('../src/server'); en el archivo deploy.js , se ejecuta todo el código de la parte src/server.js , incluida la parte app.listen(3000, ...) . Si el servidor ya se está ejecutando (usando el comando node src/server.js ), el puerto 3000 ya está en uso y se está ejecutando deploy.js (y, por lo tanto, al intentar ejecutar app.listen(3000, ...) ) se produce un error.
La solución más sencilla sería separar la lógica. Si desea conservar las declaraciones getSimpleMessage y app en el archivo src/server.js , puede eliminar la parte app.listen del archivo y, en su lugar, exportar el objeto de la app . Luego, cree, por ejemplo, un archivo index.js que importe el objeto de la app y ejecute la parte app.listen .
./index.js :
const { app } = require('./src/server'); // starting the server app.listen(3000, () => { console.log('listening on port 3000'); }); Sin embargo, sugeriría que una solución más limpia sería simplemente poner la función getSimpleMessage en un archivo separado (si es posible).