Hola, soy un programador nuevo, pero tengo problemas al intentar agregar un nuevo usuario (requerido) a un archivo json de usuarios que tengo para un banco falso. Estoy más confundido sobre el tipo de objeto que son y cómo acceder a ellos desde los datos. Agradecería cualquier palabra de consejo. Actualmente solo puedo agregar la nueva cuenta, pero reemplaza a los otros usuarios en el archivo. Así que ahora estoy tratando de agregar los usuarios antiguos y los nuevos antes de importar, pero no estoy seguro de cómo hacerlo. Mi área principal de confusión es cómo acceder y manipular los "datos" de fs.readfile
app.post('/Account', (req, res,) => { var queryParameter = req.query; console.log(queryParameter.pin); console.log(queryParameter.firstName); console.log(queryParameter.lastName); console.log(queryParameter.Balance); console.log(queryParameter.email); const tempAccount = { pin: Number(queryParameter.pin), firstName: queryParameter.firstName.toString(), lastName: queryParameter.lastName.toString(), Balance: Number(queryParameter.Balance), email: queryParameter.email.toString() }; let content = []; var data2 = tempAccount;//JSON.stringify(tempAccount, null, 2);*/ const fileName = "Routes/Users.json"; let content2 = []; fs.readFile(fileName, 'utf8', function(err, data) { data = JSON.parse(data); content2.push(JSON.stringify(data)); }); content.push(content2); content.push(data2); fs.writeFile(fileName, content, (err) => { if (err) throw err; console.log('Data written to file'); }) res.send(data); }); Here is the json file: { "user": [ { "pin": "1234", "firstName": "Peter", "lastName": "Parker", "balance": "50", "email": "spider@avenger.com" }, { "pin": "5678", "firstName": "Steve", "lastName": "Rogers", "balance": "50", "email": "captain@avenger.com" }, { "pin": "4321", "firstName": "Tony", "lastName": "Stark", "balance": "1000", "email": "iron@avenger.com" } ] }
Este es el problema clave:
let content2 = []; fs.readFile(fileName, 'utf8', function(err, data) { data = JSON.parse(data); content2.push(JSON.stringify(data)); }); content.push(content2); content.push(data2);
JSON es útil como formato de datos intercambiables, pero no es algo que desee manipular en su aplicación. Tan pronto como use JSON.stringify()
, sus datos se convierten en una cadena . La única forma de manipularlo como datos regulares nuevamente es usar JSON.parse()
.
Entonces, en su código, está analizando datos, pero dando la vuelta y encadenándolos como JSON nuevamente, y luego tratando de enviarlos a content2
. Suponiendo que no haya problemas asincrónicos (los hay, pero hablaremos de eso más adelante), content2
sería solo una matriz que contiene una sola cadena.
Dos cosas deben cambiar. Primero, debe esperar a que se carguen los datos del archivo antes de hacer cualquier otra cosa. Como @jarmod menciona en los comentarios, puede hacer esto usando una forma síncrona de readFile
, pero es mejor hacer esto asíncrono para no congelar su aplicación mientras esperamos el archivo.
Código no probado, pero prueba algo como esto:
import * as fs from 'fs/promises'; const dataFile = 'data.json'; function async loadData() { return JSON.parse( await fs.readFile(dataFile) ); } function async saveData(data) { await fs.writeFile( dataFile, JSON.stringify(data) ); }
Ahora, cuando quieras usar estas funciones, es un poco más fácil:
app.post('/Account', async (req, res, next) => { const data = await loadData(); // ... do other things here ... // For example: // data.user.push({ firstName: 'Brad' }); await saveData(data); });
Tenga en cuenta que cambié este controlador/devolución de llamada Express para que sea async
.
En el futuro, si realmente desea utilizar una base de datos local basada en archivos, consulte SQLite3. Es muy rápido y extremadamente fiable.