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"}]}
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ónVerify
retorna antes de que la variablePLAYER
sea asignada un valor dentro del callback defs.readFile
.Para resolver este problema, podemos usar la función
fs.readFileSync
en su lugar, que es una versión sincrónica defs.readFile
. Esto asegurará que el código espere a que se lea el archivo antes de continuar ejecutando la funciónVerify
.Así es como podemos actualizar la función
Verify
para usarfs.readFileSync
:En esta función actualizada, usamos
fs.readFileSync
para leer los datos del jugador de forma sincrónica y los almacenamos en la variableplayerData
. Luego, analizamos los datos JSON y extraemos el arregloPLAYERS
usandoJSON.parse(playerData).PLAYERS
.Después de eso, usamos el método
Array.find()
para buscar un jugador en el arregloPLAYERS
que tenga la misma propiedadNAME
que la que se encuentra en el objetoreq.body.PLAYERDATA
.Si se encuentra un jugador, retornamos ese objeto de jugador (
foundPlayer
). Si no se encuentra ningún jugador, retornamosfalse
.Con este código actualizado, la función
Verify
debería retornar el objeto del jugador si se encuentra, ofalse
si no se encuentra. Este valor puede ser utilizado en la funciónmove
según sea necesario.