DEV Community 👩‍💻👨‍💻

Lukas Gaucas
Lukas Gaucas

Posted on • Updated on

Node.js file system CRUD

Let me tell you one thing before getting into . I had nothing to do with this before . I am Windows user since childhood . Lot's of vibe of the filesystem particular comes (are borrowed) from Linux or related kernels ...

Execute scripts one by one keeping the order of executions as such:

  1. node CREATE : 1.1 if file not exists – will be created 1.2 if file existed before hand – a message it already existed will be presented

TIP : In order to see changes, before making next step for INSERT command , I am highly suggesting to open people.json file at the side to observe changes whilst INSERTing (appending) a new record ;

  1. node INSERT – this will append ./people.json file with a new record at very end of top-level array JSON string
  2. node REMOVE – this will swap recently appended record with an object of null
  3. node DELETE – this will completely remove (delete) file from system (the directory)


const isExist = require("fs");

const PATH = `./people.json`;

// This could be rewritten using fsPromises Class as promisified version of check whether file exists or not :
// @
isExist.access(PATH, isExist.F_OK, async (err) => {
  if (err) {
    console.error(`File by the name of ${PATH} has not existed ; ${PATH} was created .`);
    const dummy_content = `[{"id": 0, "db_engine" : "MOCKED_mongoDB", "metadata": "some_metadata", "filename": "${PATH}"}]`;
    try {
      await isExist.writeFile( PATH, dummy_content, {flag : "w+" /* r+ would throw an error !*/} , dummy_res => dummy_res /* ? res :"Dummy async operation done!") */);
    catch (err) {
  else { console.log(`File of ${PATH} already exists`); 
Enter fullscreen mode Exit fullscreen mode


const fs = require("fs");
const fsPromises = require("fs").promises;

const PATH = `./people.json`;

async function main(){

let f1 = await (fsPromises.readFile(PATH, {encoding: "utf-8"})); console.log( "current files content is: ", f1 ); // Reading the file before inserting (appending) something new may take some time , that's why hereby we strongly should use fsPromise over synchronous fs Class
let file_descriptor = null;
  try {
      /* must explicitly change default flag of "r" to sth like "r+" ! : @ */
      file_descriptor = await, "r+"); // let's assign a value to the file of people.json as file descriptor (fd)
      console.log("file_handle_descriptor reference: ", file_descriptor.fd); /* (^see below for caret) hereby file_descriptor.fd technically equals to 3 , yes simply No. 3 */
      console.log({filehandleBuffer : file_descriptor})
  catch(file_descriptor_error) {

  // Signature of : <Buffer 00 00 00 00 00> where as each pair of 00 called "hex dump" ; Each byte (8 bits) is represented as a two-digit hexadecimal number []
  let YOUR_CONTENT = ',{"id": 1, "new_data": "CRUD 123"}]'; // your content wished to be appended (inserted)
  console.log("YOUR_CONTENT_LENGTH: ", YOUR_CONTENT.length)
  Signature of fs.write() :    
  isExist.write(fd, buffer, offset [of buffer given], Buffer.alloc(length, whereas each byte presented in duplex of hex dump), position [at file start writing], (err, bytesWritten, buffer)=>{return;} | (err, stringWritten, string)=>{return;}) 
  fs.write(file_descriptor.fd, Buffer.from(YOUR_CONTENT), 0, null, f1.length-1,  (err, bytesWritten, buffer)=>{
          if (err) {throw err;}
          else {
              console.log("bytesWritten: ", bytesWritten);
              console.log("buffer: ", buffer);

  // return;

Enter fullscreen mode Exit fullscreen mode


const fsPromises = require('fs').promises;

async function main(){

  let f1 = await (fsPromises.readFile('./people.json', {encoding: "utf-8"})); console.log( "current files content is: ", Array.isArray(JSON.parse(f1)));

  let f1Parsed = JSON.parse(f1);

  let temp = [];
  f1Parsed.forEach((value, index)=>{
      temp.push({index : value})

  console.log("temp before delete: ", temp);

  temp.forEach((val, inx)=>{
        temp.find((obj) => && inx === 1)
        delete temp[inx];

  console.log("temp after delete: ", temp);

  await fsPromises.writeFile('./people.json', JSON.stringify(temp));

  // return;

Enter fullscreen mode Exit fullscreen mode

NOTE : after deleting the record a new record could be added following pattern [{ ... , null , a new record }] . However, the top level array – keep attention – will stay sparsed (i.e. of static index) !


const fsPromises = require('fs').promises;

const PATH = './people.json';

async function remove(){

  await fsPromises.unlink(PATH);`File by the name of ${PATH} was deleted`);
  console.error(err, `File by the name of ${PATH} does not exist ; TIP: Run node CREATE.js on Shell first`);

  // return;

Enter fullscreen mode Exit fullscreen mode

NOTE : At the time of writing this CRUD on IDE ,i.e.: the only way to require CJS modules was as so: require('fs').promise instead of require('fs/promises') : technically both works but depends on what IDE you work , so please pay extra attention at this part !

FINAL NOTE : this CRUD could be improved , but I am sharing its state as is , nevertheless there are limitless features or tweaks to be applied upon . If any typo found and (or) suggestions could be made, please leave it in the comment section below . Thank you and see you in the next one !

Top comments (0)

18 Useful Github Repositories Every Developer Should Bookmark

>> Check out this classic DEV post <<