es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de evitar que express renderice archivos en un directorio estático?

La parte del servidor de archivos de mi aplicación es similar a Nextcloud Files y estoy almacenando los archivos en una carpeta que está configurada en Express con router.use(express.static('files')).

El problema es que cuando subo un archivo .html con mi aplicación, cuando se redirige a /files res.redirect('/files'), en lugar de renderizar la plantilla files.pug como lo hace normalmente y como se especifica en el router, renderiza el archivo .html recién subido.


router.get('/files', (req, res) => {
res.render('files', {
algunaData: entrando
})
})

He estado buscando pero parece que más personas están atascadas en servir ese archivo .html y no muchos están tratando de detenerlo. Quizás hay un mejor método que me estoy perdiendo. ¿Existe alguna manera de evitar que Express renderice archivos en un directorio estático?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que cuando subes un archivo HTML a la misma carpeta que Express ha configurado como directorio estático, tiene prioridad sobre la ruta que has creado para renderizar la plantilla files.pug.

    Una solución sería mover los archivos subidos a una carpeta diferente que no esté configurada como directorio estático en Express. Después, puedes crear una ruta separada que sirva estos archivos subidos al cliente.

    Otra solución sería modificar la ruta que has creado para renderizar la plantilla files.pug para comprobar explícitamente la extensión de archivo del archivo solicitado. Puedes usar el módulo path en NodeJS para extraer la extensión de archivo de la ruta del archivo solicitado y solo renderizar la plantilla si la extensión de archivo no es .html.

    Aquí hay un ejemplo de cómo se vería la ruta modificada:

    const path = require('path');
    
    router.get('/files', (req, res) => {
      const ext = path.extname(req.originalUrl);
      if (ext !== '.html') {
        // renderizar la plantilla files.pug
        res.render('files', {
          someData: goingIn
        });
      } else {
        // enviar el archivo tal cual
        res.sendFile(path.join(__dirname, 'files', req.originalUrl));
      }
    });
    

    Este código comprueba la extensión de archivo del archivo solicitado usando path.extname y solo renderiza la plantilla files.pug si la extensión de archivo no es .html. Si el archivo solicitado tiene una extensión .html, envía el archivo tal cual usando res.sendFile.

    ¡Espero que esto te ayude! Si tienes más preguntas, házmelo saber.

Comments are closed.