Na podstawie zabaw z prostym modułem fs uczymy się różnicy między synchronicznymi i asynchronicznymi funkcjami node.js. Do dzieła.

Zakładam, że folder files już mamy, w nim plik lorem.txt i poniższy kod rozumiemy bez problemu:

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

var fpath = path.join(__dirname, 'files', 'lorem.txt');

Asynchroniczna funkcja exists sprawdzi, czy plik istnieje przyjmując callback do wykonania:

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

var fpath = path.join(__dirname, 'files', 'lorem.txt');

fs.exists(fpath, (exists) => { 
    console.log(exists ? 'Found' : 'Not found!'); 
}); 

//Found

Funkcja naprawdę jest asynchroniczna:

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

var fpath = path.join(__dirname, 'files', 'lorem.txt');

fs.exists(fpath, (exists) => { 
    console.log(exists ? 'Found' : 'Not found!'); 
}); 

console.log("I run first!");
// I run first!
// Found

To teraz synchroniczna wersja:

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

var fpath = path.join(__dirname, 'files', 'lorem.txt');

if(fs.existsSync(fpath))
    console.log("Found");

console.log("I run after sync code...")

// Found
// I run after sync code...

W node musimy sobie z tego zdawać sprawę i ogarniać te różnice.