Node.js 교과서 2장을 공부하고

⚠️ 본 포스팅은 매주 Node.js를 공부하고, 동아리 스터디원들과 함께 스터디한 내용을 정리하는 곳입니다.

⚠️ 모든 내용을 기록하려고 하기 보다는 함축하고 필요한 내용만 작성하고 있습니다.

https://github.com/gilbutITbook/080229

var, const, let

  1. var 사용하지 말기 (혼란을 야기함)
  2. const, let 사용
    • const: 한번 값을 할당하면 변경 불가
    • let: 변수로 사용 (스코프 적용)

템플릿 문자열

  1. 백틱(`) 을 통해서 문자열 합치기 `${num} 안녕`

객체 리터럴

var sayNode = function () {
    console.log('Node');
};
var es = 'ES';
const newObject = {
    sayJS() {
        console.log('JS');
    },
    sayNode,
    [es + 6]: 'Fantastic',
};
newObject.sayNode(); // Node
newObject.sayJS(); // JS
console.log(newObject.ES6); // Fantastic
  1. : function() 생략가능
  2. 필드명과 변수명이 동일하면 한번만 써도됨
  3. 안에서 속성명을 동적으로 생성해서 값을 추가가능

화살표 함수

var relationship1 = {
  name: 'zero',
  friends: ['nero', 'hero', 'xero'],
  logFriends: function () {
    var that = this; // relationship1을 가리키는 this를 that에 저장
    this.friends.forEach(function (friend) {
      console.log(that.name, friend);
    });
  },
};
relationship1.logFriends();

const relationship2 = {
  name: 'zero',
  friends: ['nero', 'hero', 'xero'],
  logFriends() {
    this.friends.forEach(friend => {
      console.log(this.name, friend);
    });
  },
};
relationship2.logFriends();
  1. 화살표 함수의 this는 부모의 스코프를 물려받음.
  2. 기본적으로 화살표 함수를 사용하자.

구조분해 할당

const candyMachine = {
    status: {
        name: 'node',
        count: 5,
    },
    getCandy() {
        this.status.count--;
        return this.status.count;
    },
};
const { getCandy, status: { count } } = candyMachine;
const array = ['nodejs', {}, 10, true];
const [node, obj, , bool] = array;
  1. 위의 문법 처럼 쪼개서 변수에 할당 가능

프로미스

콜백 버전

function findAndSaveUser(Users) {
  Users.findOne({}, (err, user) => { // 첫 번째 콜백
    if (err) {
      return console.error(err);
    }
    user.name = 'zero';
    user.save((err) => { // 두 번째 콜백
      if (err) {
        return console.error(err);
      }
      Users.findOne({ gender: 'm' }, (err, user) => { // 세 번째 콜백
        // 생략
      });
    });
  });
}

프로미스 버전

function findAndSaveUser(Users) {
    Users.findOne({})
        .then((user) => {
            user.name = 'zero';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({ gender: 'm' });
        })
        .then((user) => {
            // 생략
        })
        .catch(err => {
            console.error(err);
        });
}
  1. 콜백 버전의 경우에는 뎁스가 깊어지고 에러를 따로 처리해야함
  2. 프로미스 객체로 가져가면 .then 처리로 일정한 뎁스로 에러처리가 한번에 가능해짐
const promise1 = Promise.resolve('성공1');
const promise2 = Promise.resolve('성공2');
Promise.all([promise1, promise2])
    .then((result) => {
        console.log(result); // ['성공1', '성공2'];
    })
    .catch((error) => {
        console.error(error);
    });

한번에 처리도 가능

async await

프로미스 코드

function findAndSaveUser(Users) {
    Users.findOne({})
        .then((user) => {
            user.name = 'zero';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({ gender: 'm' });
        })
        .then((user) => {
            // 생략
        })
        .catch(err => {
            console.error(err);
        });
}

async await 코드

const findAndSaveUser = async (Users) => {
  try {
    let user = await Users.findOne({});
    user.name = 'zero';
    user = await user.save();
    user = await Users.findOne({ gender: 'm' });
    // 생략
  } catch (error) {
    console.error(error);
  }
};
  1. .then 대신 async await로 처리 가능
  2. 에러 처리는 try catch로