Actualmente estoy trabajando en una aplicación ExpressJS que lee un archivo yaml en json y luego envía el json al front-end para que lo use Angular.
Aquí está la estructura de archivos para el proyecto.
server/ ├── data/ │ └── file.yml ├── index.js └── routes/ └── index.js En ./routes/ tengo mi archivo index.js que, sorpresa sorpresa, contiene mis rutas. Y aquí está la ruta que estoy usando para acceder al archivo yml :
app.get('/api/assets', (req,res) => { try { let doc = yaml.safeLoad(fs.readFileSync('../data/file.yml', 'utf8')); // console.log(doc); res.json(doc); } catch (err) { let doc = { "name": err.name, "reason": err.reason, "message": err.message } res.json(doc); } });Por alguna razón, después de activar el servidor y presionar la ruta /api/assets, aparece el siguiente error:
{ "name": "Error", "message": "ENOENT: no such file or directory, open 'tenant-assets.yml'" } He intentado algunas cosas para que funcione, como cambiar el nombre del archivo a ./data/file.yml y data/file.yml , pensando que los estaba llamando desde la entrada index.js. Entonces, estoy un poco atascado y no sé qué está pasando.
Para usar una ruta relativa del archivo actual, la forma recomendada es usar path.join() y __dirname .
En tu caso:
const path = require('path'); app.get('/api/assets', (req, res) => { try { let doc = yaml.safeLoad(fs.readFileSync(path.join(__dirname, '../data/file.yml'), 'utf8')); // console.log(doc); res.json(doc); } catch (err) { let doc = { "name": err.name, "reason": err.reason, "message": err.message } res.json(doc); } });Me di cuenta de que estaba activando el servidor desde lo que efectivamente es el directorio raíz de la aplicación. Para solucionarlo, tuve que cambiar la ruta del archivo a ./server/data/file.yml .