Estoy tratando de escribir un middleware para mi sitio web express js para poder usar subdominios. También quiero usar imágenes estáticas, css y js. Mis páginas HTML se cargan bien, pero cada vez que trato de llamar a un archivo .js, obtengo un tiempo de carga de página largo y js no se carga.
Cualquier ayuda es apreciada, gracias! :)
app.use("/assets", express.static(path.join(__dirname, "assets"))); app.get("*", (req, res, next) => { let host = req.get("host").split("."); console.log(req.originalUrl); let url = req.originalUrl.split("/"); url.shift(); console.log(url); if (host.length > 2) { res.send("myWebsite.com"); } else { const pages = Page.getPages(); pages.forEach(page => { if ((url[0] == "" ? "home" : url[0] ?? "home").toLowerCase() == page.name) { if (url.length == 1 || (url.length == 2 && url[1] == "")) { page.publish(res); } } }); }});
Entonces, en Pages.html , tienes esto:
<script type="text/javascript" src="/assets/js/Pages.js"></script> Parece que generalmente sería compatible con su declaración express.static() (que se muestra a continuación) para cargar Pages.js desde su carpeta assets/js :
app.use("/assets", express.static(path.join(__dirname, "assets"))); Pero, luego, ese script Pages.js comienza inmediatamente con esto:
import Page from '../../Page.js'; Eso no funcionará cuando lo solicite el navegador. Recuerde que las rutas en las declaraciones de import de Javascript que se ejecutan en el navegador son relativas a la URL actual de la página web. El navegador intentará combinar esa URL relativa con la URL de la página web y luego solicitará a su servidor esa URL recién construida.
En este caso, terminará con algo como una solicitud de http://somehost/../../Page.js . Pero, no tiene ninguna ruta en su servidor que maneje eso. De forma predeterminada express.static() omite cualquier ruta que contenga ../ porque eso puede ser un problema de seguridad desagradable (permitiendo a los atacantes buscar cosas en el sistema de archivos de su servidor). Por lo tanto, probablemente terminará con un error 404 cuando intente obtener ese archivo.
TODOS los archivos que desea que el navegador pueda cargar, incluidas las importaciones incrustadas en otros archivos JS, deben estar en su carpeta de assets públicos (o en alguna otra carpeta a la que haya habilitado explícitamente el acceso público con algo como express.static() ).
Para tu información, si miras en la consola del navegador, probablemente veas mensajes de error que te habrían indicado dónde buscar el error.
__dirname es una variable de entorno que le indica la ruta absoluta del directorio que contiene el archivo que se está ejecutando actualmente. Debe asegurarse de que el paquete final (su carpeta de activos) esté presente en ese directorio. Intente codificar la ruta absoluta de los activos, si funciona, use el siguiente fragmento en su lugar:
app.use("/assets", "express.static(process.cwd() + '/assets'));