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);
});