Los datos consisten en una matriz de publicaciones realizadas por diferentes usuarios en la base de datos. Cada publicación contiene el _id del usuario que realizó la publicación. Quiero mapear cada publicación, obtener el _id de la publicación y obtener los datos del usuario para cada publicación. esto es lo lejos que he llegado. ¿Hay una manera adecuada de hacer esto o una mejor manera? Me estoy encontrando con errores.
const getUsers = () => { data.map(async () => { await axios({ method: "POST", withCredentials: true, url:`https://droplikebackend.herokuapp.com/api/user/get/${id}`, data: { userId: data.userId, }, }) .then((res) => { console.log(res.data); }) .catch((err) => { console.log(err); }); }); };Lo que funcionará mejor es extraer la lógica getUser exacta en una función separada. Lo que no estoy seguro es por qué el método es "POST" y por qué la identificación del usuario está tanto en la URL como en la propiedad de datos en axios.
No es necesario usar .then y .catch como puede ver, pero si quiere capturar algo, simplemente use un bloque normal de prueba/captura, no mezcle async/await con .then.catch:
const getUser = async (userId) => { const response = await axios({ method: "POST", withCredentials: true, url: `https://droplikebackend.herokuapp.com/api/user/get/${userId}`, data: { userId: userId } }); return response.data; }; Ahora sobre el uso: la función de mapa en este caso devolverá una serie de Promesas, como puede ver, y puede usar el método Promise.all() para esperarlas todas y obtener los resultados. Todas las promesas se dispararán de forma simultánea y no una por una si fuera un bucle for con esperas. Contras: si su API tiene un limitador de velocidad, puede ser baneado por un tiempo, porque para 100 publicaciones, 100 solicitudes getUser se activarán en menos de un segundo.
const getUsers = async () => { const promises = data.map((post) => getUser(post.userId)); const users = await Promise.all(promises); return users; };aplicación.js
const axios = require("axios"); const getUsers = async (id) => { const data = await axios({ method: "get", url: id // if exist id search for id, if not exist map of restult ? `https://jsonplaceholder.typicode.com/posts/${id}` : "https://jsonplaceholder.typicode.com/posts" }); if (id) { // if exist an id return a object and not array return console.log(data.data.id); } else { // map the array data.data.map((post) => console.log(post.id)); } }; getUsers(); // all post // getUser(1) only bring the post with id 1No puede usar data.map porque los datos no están definidos antes, puede validar si la función trae una identificación o no y viene con todas las publicaciones o solo con una publicación. Usé JsonPlaceHolder porque tu API es una publicación. pero es lo mismo. En mi ejemplo, con solo encontrar en la publicación es y objeto, puede pasar una matriz y con sombrero no es necesario validar si es un objeto o una matriz y el mapa de datos funcionará bien. No puede usar el mapa de datos porque los datos no está definido antes, puede validar si la función trae una identificación o no y viene con todas las publicaciones o solo con una publicación. Usé JsonPlaceHolder porque tu API es una publicación. pero es lo mismo. En mi ejemplo, con solo encontrar en la publicación es un objeto, puede pasar una matriz y con sombrero no es necesario validar si es un objeto o una matriz y el mapa de datos funcionará bien
[ { "_id": "62f45046a763042f5f35ba06", "userId": "62eb470392306d95ed89d964", "Image": "", "caption": "Monday!", "likes": [], "comments": [] }, { "_id": "62f4504ea763042f5f35ba08", "userId": "62eb470392306d95ed89d964", "Image": "", "caption": "Tuesday!", "likes": [], "comments": [] } ]Así es como se ven los datos. Quiero mostrar el nombre de usuario de los usuarios que hicieron estas publicaciones y solo puedo hacerlo obteniendo sus datos individuales del ID de usuario adjunto a la publicación.