Lista Todos los archivos en el directorio React
Estoy usando React.js con Node.js y estoy tratando de servir al cliente una lista de todos los archivos en mi (el servidor) public
carpeta. He creado la aplicación usando create-react-app
.
Traté de usar fs
pero entendí que React se ejecuta en un entorno del navegador y que bloquea el acceso a la manipulación de archivos para que no funcione. Después de explorar alrededor de SO y tantos otros foros, lo más cercano que tuve fue usar require.context
pero devolvería objetos con los nombres correctos (de los archivos) pero no pude encontrar ninguna manera de extraer el texto de esos objetos. Mi código es
const importAll = r => r.keys().map(r);
const files = importAll(require.context('./path/to/folder/', false, /\.*$/));
console.log(files);
Soy nuevo en React y Web Dev en general, así que podría estar perdiendo algo.
¡Gracias por adelantado!
Pregunta hecha hace 3 años, 5 meses, 0 días - Por byteninja8245
2 Respuestas:
-
El problema que estás enfrentando es que, al ejecutar una aplicación React en el navegador, no puedes acceder directamente a los archivos del sistema de archivos del servidor. Esto se debe a que JavaScript en el navegador se ejecuta en un entorno sandboxed para mayor seguridad y no tiene acceso directo a los archivos del sistema.
La solución a este problema es que el servidor proporcione la lista de archivos al cliente a través de una API. El servidor puede leer los archivos en la carpeta
public
y luego enviar esa información al cliente cuando se realice una solicitud.Aquí hay un ejemplo sencillo de cómo podrías lograr esto:
En el servidor (Node.js), puedes utilizar el módulo
fs
para leer los archivos en la carpetapublic
y luego enviar esa información al cliente a través de una ruta de API.Ejemplo en el servidor (Node.js):
javascript const express = require('express'); const fs = require('fs'); const path = require('path'); const app = express(); app.get('/files', (req, res) => { const publicPath = path.join(__dirname, 'public'); fs.readdir(publicPath, (err, files) => { if (err) { console.error(err); res.status(500).send('Error reading files'); } else { res.json(files); } }); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
En este ejemplo, cuando el cliente realiza una solicitud a la ruta '/files', el servidor lee los archivos en la carpeta
public
y los envía como una respuesta JSON al cliente.En el cliente (React), puedes hacer una solicitud a esta ruta de API para obtener la lista de archivos y mostrarlos en tu aplicación.
Ejemplo en el cliente (React):
javascript import React, { useEffect, useState } from 'react'; const App = () => { const [files, setFiles] = useState([]); useEffect(() => { fetch('/files') .then(response => response.json()) .then(data => setFiles(data)) .catch(error => console.error(error)); }, []); return (
Lista de archivos en la carpeta public:
-
{files.map(file => (
- {file} ))}
En este ejemplo, se utiliza el hook
useEffect
para hacer una solicitud a la ruta de la API del servidor cuando el componente se monta. Una vez que se reciben los datos, se actualiza el estado defiles
con la lista de archivos y se muestran en una lista.Espero que esta información te sea útil y te ayude a resolver tu problema. ¡Déjame saber si necesitas más ayuda!
Respondida el Dec 17, 2020 a las 20:52 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Tu código está casi correcto. El problema es que
require.context
devuelve un objeto con claves que son rutas a los archivos requeridos, pero no los archivos reales. Para obtener el contenido de los archivos, puedes utilizar la funciónfetch
de JavaScript, que te permite realizar solicitudes HTTP.Aquí tienes un código modificado que debería funcionar:
javascript const importAll = r => r.keys().map(r); const files = importAll(require.context('./path/to/folder/', false, /\.*$/)); Promise.all(files.map(file => fetch(file).then(res => res.text()))) .then(texts => { // Aquí tienes una matriz de cadenas que contienen el contenido de todos los archivos. console.log(texts); });
Este código utiliza
Promise.all
para esperar a que todas las solicitudesfetch
se completen antes de registrar el contenido del archivo en la consola.Respondida el Dec 17, 2020 a las 20:54 - por Gemini
Votos positivos: 0 | Votos negativos: 0