Loading

Quipoin Menu

Learn • Practice • Grow

node-js / Writing Files
tutorial

Writing Files

Remember writing in your diary? You open it, write your thoughts, and close it. In Node.js, writing files is similar – you create or open a file, write content to it, and save it. Let's learn how to write files!

Writing Files in Node.js

Node.js provides several methods to write files:
  • fs.writeFile() – Write (overwrites if file exists)
  • fs.appendFile() – Add to end of file (preserves existing content)
  • fs.writeFileSync() – Synchronous version
  • Promises API – Modern async/await style

Think of `writeFile` as writing a new page in your diary – it replaces everything. `appendFile` is like adding a new line at the bottom – it keeps what you already wrote.

1. Asynchronous Writing (fs.writeFile)
const fs = require('fs');

const content = 'Hello, this is my first file created with Node.js!';

fs.writeFile('message.txt', content, 'utf8', (err) => {
  if (err) {
    console.error('Error writing file:', err);
    return;
  }
  console.log('File written successfully!');
});

2. Synchronous Writing (fs.writeFileSync)
const fs = require('fs');

try {
  fs.writeFileSync('sync-message.txt', 'Synchronous write');
  console.log('File written synchronously');
} catch (err) {
  console.error('Error:', err);
}

3. Appending to Files (fs.appendFile)

Use `appendFile` to add content to the end of a file without deleting existing content.
fs.appendFile('log.txt', 'New log entryn', (err) => {
  if (err) {
    console.error('Error appending:', err);
    return;
  }
  console.log('Log entry added');
});

4. Promise-based Writing (Modern)
const fs = require('fs').promises;

async function writeData() {
  try {
    await fs.writeFile('data.txt', 'Important data');
    console.log('File written');
   
    <!-- Append more data -->
    await fs.appendFile('data.txt', 'nMore data');
    console.log('Data appended');
  } catch (err) {
    console.error('Error:', err);
  }
}

writeData();

Writing JSON Files

A very common task is writing JSON data to files.
const fs = require('fs').promises;

const userData = {
  name: 'John Doe',
  email: 'john@example.com',
  age: 30,
  hobbies: ['reading', 'coding', 'gaming']
};

async function saveUser() {
  try {
    <!-- Convert object to JSON string with pretty formatting -->
    const jsonData = JSON.stringify(userData, null, 2);
    await fs.writeFile('user.json', jsonData);
    console.log('User data saved!');
  } catch (err) {
    console.error('Error saving user:', err);
  }
}

saveUser();

Writing with Options

You can pass options to control file writing behavior.
<!-- Options: flag 'a' for append, 'wx' for exclusive write (fail if exists) -->
fs.writeFile('important.txt', 'Secret data', { flag: 'wx' }, (err) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.log('File already exists!');
    } else {
      console.error(err);
    }
    return;
  }
  console.log('File created successfully');
});

Error Handling in File Writing

Common errors when writing files:
  • EACCES: Permission denied
  • ENOSPC: No space left on device
  • EISDIR: Path is a directory, not a file
  • EEXIST: File already exists (with 'wx' flag)
fs.writeFile('/root/secret.txt', 'data', (err) => {
  if (err) {
    if (err.code === 'EACCES') {
      console.log('Permission denied. Run with appropriate privileges.');
    } else {
      console.error('Write error:', err.message);
    }
    return;
  }
  console.log('File written');
});

Practical Example: Logger
const fs = require('fs').promises;
const path = require('path');

async function logMessage(message) {
  try {
    const logFile = path.join(__dirname, 'app.log');
    const timestamp = new Date().toISOString();
    const logEntry = `[${timestamp}] ${message}n`;
   
    await fs.appendFile(logFile, logEntry);
    console.log('Logged:', message);
  } catch (err) {
    console.error('Failed to write log:', err);
  }
}

logMessage('Application started');
logMessage('User logged in');

Two Minute Drill

  • Use `fs.writeFile()` to create/overwrite files asynchronously.
  • Use `fs.appendFile()` to add content to existing files.
  • For JSON data, use `JSON.stringify()` before writing.
  • The 'wx' flag prevents overwriting existing files.
  • Always handle write errors – disk full, permission denied, etc.
  • Use `fs.promises` for cleaner async/await code.

Need more clarification?

Drop us an email at career@quipoinfotech.com