Soy principiante y trato de guardar el modelo todoModel en data.json , pero algunos elementos (title, description) no se guardan.
app.js
const http = require("http"); const todoRouter = require("./routes/todo.router"); const server = http.createServer(todoRouter); const PORT = process.env.PORT || 3000; server.listen(PORT, () => console.log(`Server listening on http://localhost:${PORT}`) ); todo.router.js
const url = require("url"); const todoController = require("../controllers/todo.controller"); const todoRouter = (req, res) => { const urlparse = url.parse(req.url, true); if (urlparse.pathname == "/todos" && req.method == "POST") { todoController.createTodo(req, res); } }; module.exports = todoRouter; todo.controller.js
const fs = require("fs"); class todoController { async createTodo(req, res) { req.on("data", (data) => { if (data) { todos.push(todoModel); fs.writeFile( "./data/data.json", JSON.stringify(todos, null, 2), (err) => { if (err) throw error; } ); } }); }} todo.model.js
const { v4: uuidv4 } = require("uuid"); const fs = require("fs"); const data = fs.readFileSync("./data/data.json"); const jsondata = JSON.parse(data); const title = jsondata.title; const description = jsondata.description; const todoModel ={ id: uuidv4(), title, description, dateOfCreate: new Date(), lastModified: new Date(), check: new Boolean(false), }; module.exports = todoModel; El modelo todoModel en data.json se ve así:
[ { "id": "cb996b22-d9d8-49ee-8e35-6f8bfc005268", "dateOfCreate": "2021-11-06T14:53:28.608Z", "lastModified": "2021-11-06T14:53:28.608Z", "check": false } ]El title y description de tus valores no tienen asignada una clave en tu todoModel . Simplemente asigne estos valores a las claves adecuadas en su objeto.
const todoModel ={ id: uuidv4(), title: title, // add key for title description: description, // and here add key for description dateOfCreate: new Date(), lastModified: new Date(), check: new Boolean(false), }; Pero el problema no acaba aquí. Su problema es que lee el archivo JSON, carga su contenido y luego vuelve a escribir el contenido sin ninguna modificación. En el archivo todo.controller.js , carga todoModel , que carga el contenido del archivo. Luego agrega este contenido a la matriz de todos y lo vuelve a escribir en el archivo. No haces ninguna modificación a todoModel , por lo que lo que hace es prácticamente nada.
Bueno, recomiendo exportar funciones y constantes y no variables u objetos que puedan cambiar. Sin embargo, preferiría usar una función aquí.
function getTodoModel() { const data = fs.readFileSync("./data/data.json"); const jsondata = JSON.parse(data); const title = jsondata.title; const description = jsondata.description; return { id: uuidv4(), title, description, dateOfCreate: new Date(), lastModified: new Date(), check: new Boolean(false), } } module.exports = getTodoModelMás tarde, simplemente importe su función y llámela:
let todoModel = getTodoModel()Las variables serán evaluadas