Node.js Fundamentals

General concepts

  • Event driven
  • Single thread
  • Non-blocking I/O
  • The event loop

Event emitters

EventEmitter is synchronous, and that means the callback is called on every cycle of the for loop

const EventEmitter = require('events').EventEmitter
let emitter = new EventEmitter()
emitter.on('numberAdded', n => console.log(n * 2))
for (let i = 0; i < 10; i++) {
  emitter.emit('numberAdded', i)
}

Asynchronous version is emitter.on('numberAdded', n => setImmediate(() => console.log(n * 2)))

Modules

// file: person.js
module.exports = {
  name: 'alexey',
  surname: 'semidotsky',
  getFullName: function(){ return `${this.name} ${this.surname}` }
}

// file: index.js
var user = require('./person' )
console.log(user.name); // alexey
console.log(user.getFullName()); //alexey semidotsky

File System

fs module

Reading a file

const fs = require('fs' )
fs.readFile('/path/to/file', (err, data) => {
   // do something with data
})

Synchronous

const fs = require('fs' )
const data = fs.readFileSync('/path/to/file')

Writing a file

const fs = require('fs' )
fs.writeFile('/path/to/file', data, (err) => {
  // check error
})

// writeFileSync - sync version

Watching files

const fs = require('fs')
const watcher = fs.watch( '/path/to/folder')
watcher.on(' change' , function(event, filename) {
  console.log(`${event} on file ${filename}`)
})

path module

const path = require('path')
const fullPath = path.join('/path/to/folder', 'README.md')
// const fullPath = path.join(__dirname, 'README.md')

Decomposing a full path in parts:

const path = require('path')
const parts = path.parse('/path/to/a/file.txt')
console.log(parts)

Streams

Readable streams

const fs = require('fs');
const http = require('http');
const server = http.createServer((request, response) => {
   response.writeHead( 200, {'Content-Type': 'text/html'});
   var stream = fs.createReadStream( './index.html' );
   stream.pipe(response);
});
server.listen(8000);

Writable streams

const fs = require('fs');
var sourceFile = fs.createReadStream('path/to/source.txt');
var destinationFile = fs.createWriteStream('path/to/dest.txt');
  sourceFile.on('data', function(chunk) {
  destinationFile.write(chunk);
});