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.

Retornando objeto de la búsqueda en archivo JSON

Estoy tratando de verificar si una solicitud entrante coincide con una base de datos de jugadores, luego devolverla a una función que luego cambiará los datos.

Siempre devuelve undefined o false. He intentado mover el retorno y no importa lo que haga, no se reasignará a la salida.

function move(req){
  Verify(req).then((PLAYER) =>{
    console.log(PLAYER);
  })
}

async function Verify(req){
  const PLAYER=false
  fs.readFile('PlayerData.json', 'utf-8', (error , output) => {
      if(error){error}
      else{
        for(let i in JSON.parse(output).PLAYERS.length){
          if(JSON.parse(output).PLAYERS[i].NAME == req.body.PLAYERDATA.NAME){PLAYER=JSON.parse(output).PLAYERS[i];}
        }
      }
  })
  return PLAYER
} 

Datos recibidos

{
  ACTION: 'MOVE',
  DIRECT: 'UP',
  PLAYERDATA: { POS: '11b', NAME: 'dfg', RANGE: '2', POINTS: '1', HEALTH: '3' }
}

Lista de jugadores

{"PLAYERS":
[{"POS":"5b","NAME":"wer","RANGE":"2", "POINTS":"1", "HEALTH":"3"},
{"POS":"11b","NAME":"dfg","RANGE":"2","POINTS":"1" , "HEALTH":"3"}]}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código parece ser debido a la naturaleza asíncrona de la función fs.readFile. La función se ejecuta de manera asíncrona, lo que significa que no bloquea la ejecución del código y la función Verify retorna antes de que la variable PLAYER sea asignada un valor dentro del callback de fs.readFile.

    Para resolver este problema, podemos usar la función fs.readFileSync en su lugar, que es una versión sincrónica de fs.readFile. Esto asegurará que el código espere a que se lea el archivo antes de continuar ejecutando la función Verify.

    Así es como podemos actualizar la función Verify para usar fs.readFileSync:

    function Verify(req) {
      const playerData = fs.readFileSync('PlayerData.json', 'utf-8');
      const players = JSON.parse(playerData).PLAYERS;
      const foundPlayer = players.find(player => player.NAME === req.body.PLAYERDATA.NAME);
      return foundPlayer || false;
    }
    

    En esta función actualizada, usamos fs.readFileSync para leer los datos del jugador de forma sincrónica y los almacenamos en la variable playerData. Luego, analizamos los datos JSON y extraemos el arreglo PLAYERS usando JSON.parse(playerData).PLAYERS.

    Después de eso, usamos el método Array.find() para buscar un jugador en el arreglo PLAYERS que tenga la misma propiedad NAME que la que se encuentra en el objeto req.body.PLAYERDATA.

    Si se encuentra un jugador, retornamos ese objeto de jugador (foundPlayer). Si no se encuentra ningún jugador, retornamos false.

    Con este código actualizado, la función Verify debería retornar el objeto del jugador si se encuentra, o false si no se encuentra. Este valor puede ser utilizado en la función move según sea necesario.

Comments are closed.