본문 바로가기

분류 전체보기138

Error: listen EADDRINUSE: address already in use :::3001 Error: listen EADDRINUSE: address already in use :::3001 서버를 띄웠을때 이런 에러 메시지가 뜨면, 같은 포트에 종료안한 서버가 띄워져있어서 그런 것이다. 포트를 바꾸거나 터미널에서 찾아서 kill 하면 된다. $ lsof -wni tcp:3001 // 현재 3001 포트에 실행중인 내용을 보여준다. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 16426 effy 22u IPv6 - 0t0 TCP *:redwood-broker (LISTEN) $ kill 16426 // kill [PID] 명령어 설명 lsof(LiSt Open Files) : 현재 시스템에 열려있는 파일, 그 파일을 사용중인 프로세스 목.. 2020. 2. 5.
Express의 오류 처리 http://expressjs.com/ko/guide/error-handling.html Express 오류 처리 오류 처리 다른 미들웨어 함수와 동일반 방법으로 오류 처리 미들웨어 함수를 정의할 수 있지만, 오류 처리 함수는 3개가 아닌 4개의 인수, 즉 (err, req, res, next)를 갖는다는 점이 다릅니다. 예를 들면 다음과 같습니다. app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); }); 오류 처리 미들웨어는 expressjs.com Express Document를 읽고 알게 된 사항을 정리함. app.use와 app.post 등등의 차이점 ap.. 2020. 1. 31.
map 안에서 async/await 사용시 Promise가 리턴되는 문제 const arr = [1,2,3,4]; const result = arr.map(async (item) => { await sampleFunction(item); }) function sampleFunction(item) { return item + 1; } console.log(result); // [2, 3, 4, 5]를 리턴할 것 같지만 /** [ Promise { }, Promise { }, Promise { }, Promise { } ] 를 리턴한다. */ map 안에서 async/await을 사용했을 때, return값으로 Promise { pending } 이 들어오는 문제가 생긴다. .map은 내부적으로 단순하게 아래 코드와 같다고 생각하면 된다. const result = []; for.. 2020. 1. 23.
[Javascript] 특정 문자열 잘라내기 특정 문자열을 잘라내야 할 경우가 있다. 예를 들면, 메일의 자동 발송을 고려하여 고객명을 아래와 같이 DB에 저장해두었다고 하자. 홍길동 부장님 귀하 홍길동 귀하 홍길동님 귀하 이런식으로 작성하다가, 자동으로 템플릿에 귀하를 추가해주게 된 것이다. 그러면 기존 데이터의 귀하를 제거해야 한다. 그런 경우 아래와 같이 해주면 const arr = ['홍길동 귀하', '홍길동 부장님 귀하', '홍길동님 귀하'] for (item of arr) { const index = item.indexOf(' 귀하'); if (index > 0 && index+3 === item.length){ // '귀하'가 존재하고, 가장 마지막에 있을 때만 const result = item.slice(0, -3); console.. 2020. 1. 23.
Refactoring - Replace Function with Command Martin Fowler - Refactoring을 읽고 정리한 글입니다.(337~343p) // Before function score(candidate, medicalExam, scoringGuide) { let result = 0; let healthLevel = 0; // long body code } // After class Scrorer { constructor(candidate, medicatExam, scroingGuide) { this._candidate = candidate; this._medicalExam = medicalExam; this._scoringGuide = scoringGuide; } execute() { this._result = 0; this._healthLevel .. 2020. 1. 2.
Refactoring - Introduce Assertion Martin Fowler - Refactoring을 읽고 정리한 글입니다.(302~304p) // Before if (this.discountRate) base = base - (this.discountRate * base); // After assert(this.discountRate >= 0); // assert 추가 if (this.discountRate) base = base - (this.discountRate * base); 예제는 할인하는 코드. 만약에 discountRate가 0이면 할인이 안됨. Motivation 특정 조건을 만족시켜야 동작하는 코드가 있을 때 추론하기보다는 어썰션이 있으면 좋다. 어썰션은 항상 참일 것을로 추정되는 컨디셔널 스테이트먼트다. 실패하면 에러를 일으킨다. 어.. 2019. 12. 31.
Refactoring - Decompose Conditional Martin Fowler - Refactoring을 읽고 정리한 글입니다.(260~262p) // Before if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) charge = quantity * plan.summerRate; else charge = quantity * plan.regularRate + plan.regularServiceCharge; // After if (summer()) charge = summerCharge(); else charge = regularCharge() 조건문 분해. 프로그램의 복잡도를 올리는 가장 흔한 요소는 조건부 로직이다. 다양한 조건의 코드를 쓰면 함수는 길어져도 빨리 끝낼 수 있다.. 2019. 12. 31.
Refactoring - Split Variable Martin Fowler - Refactoring을 읽고 정리한 글입니다.(240~243p) 예제 // Before let temp = 2 * (height + width); temp = height * width; // After const perimeter = 2 * (hieght + width); // perimeter : 주변, 외곽 const area = height * width; temp라는 변수를 let으로 선언하고 수정하고 있는데 밑에는 보면 두 개의 const로 선언해서 쓰고있다. 이렇게 변수를 나누는것. Motivation 변수는 다양하게 쓰인다. 그 결과 변수의 값이 여러번 할당되기도 한다. for문에서 쓰는 index[i]같은 변수는 실행될때마다 바뀐다. 변수는 값을 메서드가 진행.. 2019. 12. 31.
Refactoring - Move Statesments into Function Martin Fowler - Refactoring을 읽고 정리한 글입니다.(213~216p) Move Statesments to Callers의 반대 케이스. 예제 // Before result.push(`title: ${person.photo.title}`); // 이 라인을 result.concat(photoData(person.photo)); function photoData(aPhoto) { return [ `location : ${aPhoto.location}`, `date : ${aPhoto.date.toDateString()}`, ]; } // After result.concat(photoData(person.photo)); function photoData(aPhoto) { return [.. 2019. 12. 31.