raycon / til

Today I Learned
MIT License
16 stars 3 forks source link

Node #26

Open raycon opened 3 years ago

raycon commented 3 years ago

Node

비동기 이벤트 주도 JavaScript 런타임

Global Objects

console, setTimeout(), clearTimeout(), setInterval(), clearInterval() 등의 객체가 있다. 브라우저에서는 모든 Global Object를 window Object를 통해서 접근할 수 있다.

window.console.log(...)
var message = '';
window.message

node 는 window 대신 global 객체가 있다.

var message = '';
console.log(global.message) // undefined!
global.setTimeout(...)

window와는 다르게 변수나 함수가 global 객체에 추가되지 않는다.

Modules

// logger.js
var url = "http://mylogger.io/log";

function log(message) {
  // Send an HTTP request
  console.log(message);
}

module.exports.log = log;
// module.exports.endPoint = url;
// app.js
// module.exports 객체가 logger로 할당된다.
const logger = require('./logger');
console.log(logger);
// output: { log: [Function: log] }

logger.log('message');
// output: message

module.exports에 변수나 함수를 직접 할당할 수 있다.

// logger.js
function log(message) {
  console.log(message);
}
module.exports = log;
// app.js
const log = require('./logger');
log('message')

Module Wrapper Function

모듈은 exports, require, module, __filename, __dirname이 파라미터로 전달되는 Module Wrapper Function에 의해 감싸진다.

// 간략한 버전
(function (exports, require, module, __filename, __dirname) {

  function log(message) {
    console.log(message);
  }

  module.exports = log;
  // 같은 의미로 사용할 수 있다.
  // module.exports.log = log;
  // exports.log = log;

  // export는 module.exports에 대한 참조라서 아래와 같이 선언할 수 없다.
  // exports = log;
}

Built-in Modules

OS

const os = require('os');
var totalMemory = os.totalmem();
var freeMemory = os.freemem();

console.log('Total Memory: '+ totalMemory);
console.log(`Free Memory: ${freeMemory}`);  // ES6 / ECMA2015 문법

File System

const fs = require('fs');

// 동기
// 성능 저하의 원인
const files = fs.readdirSync('./');
console.log(files);

// 비동기. 콜백으로 결과를 받는다.
fs.readdir('./', function(err, files) {
  if(err) console.log('Error', err);
  else console.log('Result', files);
});

Events

Event Emitter 클래스를 사용한다. 노드가 제공하는 기본 모듈들은 Event Emitter를 구현하는 것이 많다.

const EventEmitter = require('events');
const emitter = new EventEmitter();

// Register a listener
// emitter.on('messageLogged', function(arg) {
//    console.log('Listener called', arg);
// });

emitter.on('messageLogged', (arg) => {
    console.log('Listener called', arg);
});

// Raise an event
// emit: Making anoise, produce - signalling
emitter.emit('messageLogged', { id: 1, url: 'http://' });

HTTP

http.Servernet.Server를 상속받는다. net.ServerEventEmitter를 상속 받는다.

Class: net.Server#
Added in: v0.1.90
Extends: <EventEmitter>
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/') {
    res.write('Hello World');
    res.end();
  }

  if (req.url === '/api/courses') {
    res.write(JSON.stringify([1, 2, 3]));
    res.end();
  }
});

server.listen(3000);

console.log('Listening on port 3000...');
raycon commented 3 years ago