Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

185
Visualizações
¿Cómo modificar de forma segura archivos globales/escribir en una solicitud POST exprés?

Estoy escribiendo mi primer servidor expreso muy simple para fines de recopilación de datos. Esta parece una pregunta para principiantes, pero no pude encontrar una respuesta hasta ahora. Los datos son muy pequeños (menos de 500 enteros) y nunca crecerán, pero deberían poder cambiarse a través de solicitudes POST.

Esencialmente (ligeramente simplificado) quiero:

  • Tenga los datos en un archivo .json que se carga cuando se inicia el servidor.
  • En una solicitud POST, modifique los datos y actualice el archivo .json.
  • En una solicitud GET, simplemente envíe el .json que contiene los datos.

No quiero usar una base de datos para esto, ya que los datos son solo una matriz pequeña que nunca crecerá en tamaño. Mis dudas son principalmente cómo manejar la modificación de los datos globales y la lectura/escritura de archivos de forma segura, es decir, la concurrencia y cómo ejecuta Node exactamente el código.

tengo lo siguiente

 const express = require('express'); const fs = require('fs'); let data = JSON.parse(fs.readFileSync('./data.json')); const app = express(); app.listen(3000); app.use(express.json()); app.get("/", (req, res) => { res.sendFile('./data.json', { root: __dirname }); }); app.post("/", (req, res) => { const client_data = req.body; // modify global data fs.writeFileSync("./data.json", JSON.stringify(data), "utf8"); });

Ahora no tengo idea de si es seguro hacerlo o por qué. Por ejemplo, modificando la variable data globales y escribiendo en el archivo. Primero asumí que las solicitudes no pueden ejecutarse simultáneamente sin usar explícitamente funciones asíncronas, pero parece que ese no es el caso: inserté esto:

 const t = new Date(new Date().getTime() + 5000); while(t > new Date()){}

en app.post(.. llame para tratar de entender cómo funciona esto. Luego hice solicitudes POST simultáneas y terminaron al mismo tiempo, lo cual no esperaba.

Claramente, la devolución de llamada que paso a app.post(.. no se ejecuta de una vez antes de que se manejen otras solicitudes POST. Pero luego tengo una devolución de llamada ejecutándose simultáneamente para todas las solicitudes POST, y modificar los data globales y escribir en el archivo no es seguro / una condición de carrera Sin embargo, todo el código que pude encontrar en línea lo hizo de esta manera.

¿Estoy en lo correcto aquí? Si es así, ¿cómo modifico los datos de forma segura y los escribo en un archivo? Si no, no entiendo cómo este código es seguro en absoluto.

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Un código como ese realmente abre su sistema a las condiciones de carrera. Node en realidad ejecuta ese código en una forma de subproceso único, pero cuando comienza a abrir archivos y todo eso, es procesado por múltiples subprocesos (abrir archivos no son procesos de Node, se delegan al sistema operativo).

Si realmente desea usar archivos como sus datos globales, entonces supongo que puede usar un concepto de sistema operativo llamado Exclusiones mutuas. Básicamente, es un 'bloqueo' que se usa para evitar condiciones de carrera al obligar a los procesos a esperar mientras algo está accediendo al recurso compartido (o si el recurso compartido está ocupado). En Node, esto se puede implementar de muchas maneras, pero una recomendación es usar la biblioteca async-mutex para manejar conexiones simultáneas y modificaciones de datos simultáneas. Puedes hacer algo como:

 const express = require('express'); const fs = require('fs'); const Mutex = require('async-mutex').Mutex; // Initializes shared mutual exclusion instance. const mutex = new Mutex() let data = JSON.parse(fs.readFileSync('./data.json')); const app = express(); app.listen(3000); app.use(express.json()); app.get("/", (req, res) => { res.sendFile('./data.json', { root: __dirname }); }); // Turn this into asynchronous function. app.post("/", async (req, res) => { const client_data = req.body; const release = await mutex.acquire(); try { fs.writeFileSync('./data.json', JSON.stringify(data), 'utf8'); res.status(200).json({ status: 'success' }); } catch (err) { res.status(500).json({ err }); finally { release(); } });

También puede usar Promise.resolve() para lograr resultados similares con la biblioteca async-mutex .

Tenga en cuenta que le recomiendo que use una base de datos en su lugar, ya que es mucho mejor y abstrae muchas cosas para usted.

Referencias:

  • Condiciones de carrera de Node.js
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda