Goal
- Command line tools
- Servers with Express
- File system
Node History
- 2009 Ryan Dahl, JS Runtime based on Chrome's v8 Engine
- 2011 npm v1 - sharing open source node libs
- 2015 Node Foundation - Microsoft, Paypal, IBM, Groupon
Node General
- non-blocking, single-threaded
- events in event queue, handled in that order
- asynchronous
Node Basics
const path = require('path');
// __dirname (full path)
// __filename (full path)
const filename = path.basename(__filename);
- files are modules
- process object
Process
- exit()
- on events
- data
- exit
- stdout
- write()
- cursorTo())
- clearLine()
Core
- util - logging
- path - getting path names
- fs - reading / writing files
- v8 - mem
- events - pubsub
- readline
const path = require("path");
const util = require("util");
const v8 = require("v8");
const events = require("events");
const readline = require("readline");
const dirUploads = path.join(__dirname, "www", "files", "uploads");
// makes ./www/files/uploads folder
const storageFilesDirPath = path.join(__dirname, "storage-files", 'colors.md);
// makes ./storage-files/colors.md file
//** use diff streams for input and output */
const readlineInterface = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
readlineInterface.question("How do you like Node?\n", (answer) => {
console.log(`Your answer: ${answer}`);
});
Modules
- module.exports =
- var myvar = require('./path');
Events
- pubsub events
const events = require("events");
const emitter = new events.EventEmitter();
emitter.emit("customEvent", "Hello World", "Computer");
emitter.on("customEvent", (message, user) => {
util.log(`${user}: ${message}`);
});
fs - FileSystem
- exists() / existsSync()
- mkDir() / mkDirSync()
- readdir() / readdirSync()
- rename() / renameSync()
- unlink() / unlinkSync
- writeFile()
- appendFile() // creates or modifies
- readFile
// check if dir exists sync
const dirExists = fs.existsSync('./storage-files');
// async
fs.exists('./storage-files', cb);
// mkdir
fs.mkdirSync('./storage-files');
fs.mkdir('./storage-files', cb)
// readdir
fs.readdirSync(dirpath).forEach()
fs.readdir(pathname, (err, data) => {})
// rmdir
fs.rmdirSync(newDirPath2);
fs.rmdir(newDirPath2, cb);
// rename
fs.rename(oldDirPath,newDirPath)
fs.renameSync(oldDirPath,newDirPath, cb)
// unlink - delete file
fs.unlinkSync("./programs/storage-files/colors.md");
// write file
fs.writeFile(filePath, 'content', (err)=>handleErr(err))
fs.writeFileSync(filePath, 'content')
// create -- creates if doesn't exist
fs.appendFile('./destination/folder.file.md', 'text to add', (err) => handle(err))
// readFile
fs.readFile(filePath, 'utf-8', (err, data) => {})
fs.readFileSync(filePath, 'utf-8')
Streams
- fs.createReadStream
- fs.createWriteStream
- on
- data
- end
- once
- data
// READ
const fs = require("fs");
const path = require("path");
const mdPath = path.join(__dirname, "assets", "lorum-ipsum.md");
const readStream = fs.createReadStream(mdPath, "utf-8");
let fileText = "";
readStream.on("data", (data) => {
fileText += data;
});
readStream.once("data", (data) => {
console.log(data.length);
});
readStream.on("end", () => {
console.log(`I read a total of ${fileText.length - 1} chars`);
});
// WRITE (uses proces.stdin.on to get user input
const newFilePath = path.join(__dirname, "assets", "write-stream.txt");
const writeStream = fs.createWriteStream(newFilePath, "UTF-8");
writeStream.write("hello world\n");
process.stdin.on("data", (data) => {
writeStream.write(data);
if (data.toString().trim() === "exit") {
process.exit();
}
});
Child Process
- open a URL - cp.exec('open www.google.com')
- open an application
- run commands in terminal
- run node commands
// child process
const cp = require("child_process");
cp.exec("open http://www.linkedin.com");
cp.exec("open -a Terminal .");
cp.exec("ls", (err, data) => {
throwErr(err);
console.log(data);
});
cp.exec("node programs/fsReadStream.js", (err, data, stderr) => {
console.log(data);
});