Estoy tratando de servir un repositorio clonado dado usando NodeJS y ExpressJS. Pude clonarlo localmente, pero no puedo enviarlo a la interfaz. Este es mi código:
const express = require("express"); const app = express(); const port = 3000; const path = require("path"); const { execSync } = require("child_process"); // function to download the repo const downloadRepo = (repoURL) => execSync(`git clone ${repoURL}`, { stdio: [0, 1, 2], cwd: path.resolve(__dirname, ""), }); // route to clone the repo app.get("/:repoOwner/:repoName", async (req, res) => { const { repoOwner, repoName } = req.params; // composing the repo URL to be downloaded const fullRepoURL = `https://github.com/${repoOwner}/${repoName}.git`; // downloading the repo in the root folder await downloadRepo(fullRepoURL); // returns the FULL URL of the repo in the frontend res.send(fullRepoURL); // trying to return the repo's content in the the frontend // I get status 304 (not modified) res.sendFile(path.resolve(__dirname, repoName)); }); app.listen(port, () => { console.log(`App listening at http://localhost:${port}`); });No es una respuesta directa, sino un par de comentarios y sugerencias:
Un repositorio de Git no es un solo archivo, por lo que sendFile no funcionará.
Su código ejecuta send y sendFile en un controlador. Esto no funcionará porque solo puede enviar una sola respuesta por solicitud.
Un clon de Git es una operación de ejecución prolongada (de varios segundos a minutos o incluso horas) que no debe ejecutarse dentro de un controlador de solicitudes. Con la versión actual, incluso bloquearía más solicitudes debido a execSync .
Si desea "devolver" el repositorio, puede comprimirlo y enviar el repositorio completo en un solo archivo ZIP (sin embargo, esta es una funcionalidad que cubre GitHub, por lo que este código ni siquiera sería necesario).
Sugerencias adicionales basadas en la información proporcionada:
Tenga un punto final de "repositorio de clones" que inicie la clonación dentro de un trabajo en segundo plano (eche un vistazo, por ejemplo, a la agenda o herramientas de programación de trabajos similares para Node) y que escriba el resultado en un archivo ZIP.
Tenga otro punto final donde pueda verificar continuamente el estado o el progreso de la clonación, y que finalmente devuelva una URL de descarga (es decir, el archivo ZIP producido que puede servir con el middleware express.static ).
Como alternativa, no comprima los datos en formato ZIP, sino sirva el clon a través del sistema de archivos (también, por ejemplo, utilizando express.static ).