Home > Net >  How To Write and Read JSON texts on single file
How To Write and Read JSON texts on single file

Time:09-18

I'm receiving events in JSON format via a POST route, I would like to save these events in a file like 'example.json' and be able to query it.

I tried using writeFileSync, but it rewrites the entire file. With the flag {flag: 'a '} I was able to save more than one record, but when I try to require 'example.json', I get an error 'Unexpected token { in JSON'.

Works fine when the file has only one record, but gives the error after the second one.

Code:

const filePath = './example.json';
const fs = require('fs');
const file = require('./example.json');

app.post('/events', (request, response) => {
  response.send(request.body);
  const contentString = JSON.stringify(request.body);
  return fs.writeFileSync(filepath, contentString, {flag: 'a '});
});

example.json that works:

{"type":"call.new","call_id":"71252742562.40019","code":"h9e8j7c0tl0j5eexi07sy6znfd1ponj4","direction":"inbound","our_number":"1130900336","their_number":"11999990000","their_number_type":"mobile","timestamp":"2020-04-01T00:00:00Z"} 

example.json (with two records) that stop working:

{"type":"call.new","call_id":"71252742562.40019","code":"h9e8j7c0tl0j5eexi07sy6znfd1ponj4","direction":"inbound","our_number":"1130900336","their_number":"11999990000","their_number_type":"mobile","timestamp":"2020-04-01T00:00:00Z"}{"type":"call.ongoing","call_id":"71252731962.40019","code":"h9e8j7c0tl0j5eexi07sy6znfd1ponj4","direction":"inbound","our_number":"1130900336","their_number":"11999990000","their_number_type":"mobile","timestamp":"2020-04-01T00:00:00Z"} 

How can I write this JSON in a readable form? That does not present the error above and it is possible to perform the require.

Could someone help me, please?

CodePudding user response:

Try to read the JSON file, parse it, add new elements to the array and then overwrite the file.

const fs = require("fs");
const path = require("path");

const FILE_PATH = path.join(__dirname, "./elements.json");

const file = fs.readFileSync(FILE_PATH);
const elements = JSON.parse(file);

const newElement = { id: Date.now() };
const updatedElements = [...elements, newElement];

fs.writeFileSync(FILE_PATH, JSON.stringify(updatedElements));

See more here: https://nodejs.org/api/fs.html#fsappendfilesyncpath-data-options

  • Related