Soy nuevo en la consulta de nodo. Estoy usando Node Express para mi aplicación de backend. Tengo un json anidado que tiene tres opciones de idioma y dentro del idioma hay opciones auth, dashboard, data y data1. Quiero filtrar la consulta y mostrar el resto de los datos json en mi navegador. por ejemplo, si escribo una url como esta: http://localhost:5000/?namespaces=auth&languages=en,fi entonces se mostrará el idioma en y los datos de fi's y desde namespaces quiero mostrar los datos de auth's. Para mostrar los datos, he creado un objeto vacío de salida y quiero agregarlo en mi objeto de salida. pero no sé cómo hacer eso.

Compartí mi código en codesandbox.

Estos son mis datos json

{
    "en": {
        "auth": {
            "welcomeMessage3": "Hi John"
        },
        "dashboard": {
            "welcomeMessage": "Hi Doe"
        },
        "data (1)": {
            "welcomeMessage3": "Hi Jonny"
        },
        "data": {
            "welcomeMessage3": "Hi Monty"
        }
    },
    "fi": {
        "auth": {
            "welcomeMessage3": "Moi name "
        },
        "dashboard": {
            "welcomeMessage": "Moi dashboard"
        },
        "data (1)": {
            "welcomeMessage3": "Moi data 1"
        },
        "data": {
            "welcomeMessage3": "Moi data"
        }
    },
    "sv": {
        "auth": {
            "welcomeMessage3": "Hej John"
        },
        "dashboard": {
            "welcomeMessage": "Hej dashboard"
        },
        "data (1)": {
            "welcomeMessage3": "Hej data"
        },
        "data": {
            "welcomeMessage3": "Hej data"
        }
    }
}

Esta es mi aplicación express

    const express = require('express')
    const app = express()
    const port = 5000
    const translationData = require('./translations'); // My json
    
    
    const filterTranslations = (namespaces, languages) => {
  let output = {};
  const translations = { ...translationData };
  console.log("I am typing Languages", languages);
  console.log("I am typing namespace", namespaces);
  for (const lng in translations) {
    console.log("languages are coming from translation json", lng);
    if (lng.length !== 0 && lng !== languages) {
      delete translations[lng];
      console.log("Delete rest of the language", lng);
    } else {
      for (const ns in translations[lng]) {
        if (ns.length !== 0 && ns !== namespaces) {
          delete translations[lng][ns];
          console.log("delete rest of the Namespace", ns);
        }
      }
    }
  }
  return output;
};
    
    
    app.get('/', (req, res) => {
      res.send(
        filterTranslations(
          req.query.namespaces,
          req.query.languages,
        )
      )
    })
    
    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`)
    })
1
Krisna 9 oct. 2020 a las 12:35

2 respuestas

La mejor respuesta

Hay varios errores:

  • la función filterTranslations debería devolver un valor, aquí translations,
  • las condiciones en su declaración if no son correctas: lng !== languages, en su ejemplo, languages = 'en,fi' y lng serán en o fi. Mira String.includes( searchString [, position ]) o split tu languages y usa Array.includes( searchElement[, fromIndex]).

Esperando haberte ayudado, ¡que tengas un buen día!

1
Nicolas T. 9 oct. 2020 a las 12:03

Si entiendo correctamente lo que está tratando de hacer, creo que complica demasiado las cosas.

En primer lugar, pasar una cadena separada por comas como parámetro no es la mejor idea, ya que tendría que convertirla en una matriz en el backend dividiendo la cadena en la coma. Es mejor si es una matriz para empezar. Eso significa que su URL sería:

Http: // localhost: 8080 /? namespaces = auth & languages ​​[] = en & languages ​​[] = fi

Entonces la función que maneja esto sería:

const filterTranslations = (namespaces, languages) => {
  let output = [];
  const translations = { ...translationData };
  //languages are now an array
  for (let l in languages) {
    let lng = languages[l];
    // for each language you send as a parameter you push a new object in your output with the language as a key and the values
    output.push({[lng]:translations[lng]});
  }
  return output;
};

El resultado esperado es el siguiente:

[
    {
        "en": {
            "auth": {
                "welcomeMessage3": "Hi John"
            },
            "dashboard": {
                "welcomeMessage": "Hi Doe"
            },
            "data (1)": {
                "welcomeMessage3": "Hi Jonny"
            },
            "data": {
                "welcomeMessage3": "Hi Monty"
            }
        }
    },
    {
        "fi": {
            "auth": {
                "welcomeMessage3": "Moi name "
            },
            "dashboard": {
                "welcomeMessage": "Moi dashboard"
            },
            "data (1)": {
                "welcomeMessage3": "Moi data 1"
            },
            "data": {
                "welcomeMessage3": "Moi data"
            }
        }
    }
]
0
Stavros Angelis 9 oct. 2020 a las 12:14