# NodeJS Learning
## Event Listener
```javascript=
// Create event listener
emitter.on(event, function(arg1, arg2))
// trigger the event
emitter.emit(event, [arg1], [arg2])
```
### Modules
> `fs` `path` `http`
- `fs`
- `fs.writeFile(filePath, 'what to write in', callback)`
- `fs.readFile()`
- `fs.mkdir(file, {}, callback)`
- `fs.rename()`
```javascript=
fs.readFile(filePath, (data, err) => {})`
```
- `path`
```javascript=
path.join(__dirname, '..', '..')
path.extname(filePath)
```
- `http`
- Use ES6 instead
```javascript=
import { URL } from 'url'; // in Browser, the URL in native accessible on window
const __filename = new URL('', import.meta.url).pathname;
const __dirname = new URL('.', import.meta.url).pathname;
```
## Request and Response
- `res.end('')`
- `res.writeHead(status, {'Content-Type': 'text/html'})`
- `req.url`
## Mixed together
```javascript=
const server = http.createServer((req, res) => {
// Build filePath
const filePath = path.join(
__dirname,
"public",
req.url === "/" ? "index.html" : req.url
);
console.log(filePath);
// Extension
let extname = path.extname(filePath);
// Initial contentType
let contentType = "text/html";
switch (extname) {
case ".js":
contentType = "text/js";
break;
case ".css":
contentType = "text/css";
break;
case ".json":
contentType = "application/json";
break;
case ".jpg":
contentType = "img/jpg";
break;
case ".png":
contentType = "img/png";
break;
}
// Read file
fs.readFile(filePath, (err, data) => {
if (err) {
// Page not found
if (err.code == "ENOENT") {
fs.readFile(
path.join(__dirname, "public", "404.html"),
(err, data) => {
res.writeHead(200, { "Content-Type": "text/html" });
res.end(data, "utf-8");
}
);
} else {
// Some Server Error
res.writeHead(500);
res.end(`Server Error ${err.code}`);
}
} else {
// Success
res.writeHead(200, { "Content-Type": contentType });
res.end(data, "utf-8");
}
});
})
```