nikoskon
nikoskon

Reputation: 70

Node.js writing data to file results in additional written characters

as the title says, when i try to save data to a file using the filesystem function fs.writeFile(), sometimes the file has extra data on it. My code: fs.writeFile('path', JSON.stringify(data), function (err) {});

May be its because of the JSON.stringify(), or its a problem of the fs.writeFile.

If you need additional information, im willing to give it!

More code:

function CheckLeaderBoards(player, tag, points) {
    fs.readFile(datapath + '/data/topplayers.json', function(err, data) {
        var lb = JSON.parse(data);
        var isin = false;
        for (let i = 0; i < lb.length; i++) {
            if (lb[i].tag == tag) {
                isin = true;
                lb[i].points = points;
                break;
            }
        }
        if (!isin)
            lb.push({"player": player.toString(), "tag": tag.toString(), "points": parseInt(points)});
        for (let i = 0; i < lb.length; i++) {
            var bestpoints = -100;
            var bestindex = 0;
            for (let j = i; j < lb.length; j++) {
                if (lb[j].points > bestpoints) {
                    bestpoints = lb[j].points;
                    bestindex = j;
                }
            }
            lb = ChangeArrayIndex(lb, bestindex, i);
        }
        fs.writeFile(datapath + '/data/topplayers.json', JSON.stringify(lb), function (err) {});
    })
}

function ChangeArrayIndex(array, fromIndex, toIndex) {
    var arr = [];
    for (let i = 0; i < array.length; i++) {
        if (i == toIndex) arr.push(array[fromIndex]);
        if (i == fromIndex) continue;
        arr.push(array[i]);
    }
    return arr;
}

Basicly i want to write a leaderboard, i have an array of JSON Objects, ex: {"player":"Bob","tag":"a10b","points": 10},...

Upvotes: 1

Views: 1144

Answers (2)

Mudassir
Mudassir

Reputation: 596

To write in a file, you to open the file, in callback you will get file descriptor that descriptor will be used to write in the file. Please see example:

  fs.open(datapath + '/data/topplayers.json', 'wx', function(error, fileDescriptor){        
    if(!error && fileDescriptor){        
        var stringData = JSON.stringify(data);        
        fs.writeFile(fileDescriptor, stringData, function(error){        
            if(!error){        
                fs.close(fileDescriptor, function(error){        
                    if(!error){        
                        callback(false);        
                    }else{        
                        callback('Error in close file');        
                    }        
                });        
            }else{        
                callback('Error in writing file.');        
            }        
        });        
    }        
}        

Upvotes: 5

eum602
eum602

Reputation: 66

Ok, If you want to update the file, please check this code:

const myUpdaterFcn = (dir,file,data,callback)=>{
           //dir looks like this: '/your/existing/path/file.json'

  // Open the file for writing (using the keyword r+)
  fs.open(dir, 'r+', (err, fileDescriptor)=>{
    if(!err && fileDescriptor){
      // Convert data to string
      const stringData = JSON.stringify(data)

      // Truncate the file
      fs.truncate(fileDescriptor,err=>{
        if(!err){
          // Write to file and close it
          fs.writeFile(fileDescriptor, stringData,err=>{
            if(!err){
              fs.close(fileDescriptor,err=>{
                if(!err){
                  callback(false)
                } else {
                  callback('Error closing existing file')
                }
              })
            } else {
              callback('Error writing to existing file')
            }
          })
        } else {
          callback('Error truncating file')
        }
      })
    } else {
      callback('Could not open file for updating, it may not exist yet')
    }
  })

}

Good Luck.

Upvotes: -1

Related Questions