발생일: 2021.02.22 키워드: yarn config, npm config, registry, npmrc, private registry 문제: 갑자기 전체 태스크가 실패했고, 건너자리 A가 코드 원복까지 했는데도 계속 지속됐다. 에러 문구를 보니 특정 npm 모듈의 리파지터리를 찾지 못하는 문제다. node_modules 디렉토리를 날리고 새로 설치해도 동일한 문제가 발생했다고 한다. 이번에 npm registry 를 변경하는 작업을 준비하고 있었는데, 새로 설치된 모듈이 아직 준비되지 않은 새 레지스트리를 바라본 것이 문제였다. 왜 그런걸까? 해결책: 이번에 옮기려던 레지스트리는 도메인과 권한이 기존과 모두 달랐다. 예를 들어, https://old_registry.example.com 에서 h..
발생일: 2019.05.31 키워드: Array.sort, sort, 정렬 문제: 아래와 같이 sort() 함수로 정렬했는데, [1, 5, 10, 20].sort(); 결과가 아래와 같이 기대했던 것처럼 나오지 않는다. [1, 10, 20, 5] 으잉? 해결책: 나만 몰랐나... Array.sort() 의 기본 정렬 기준은 문자열의 유니코드 포인트였다. 숫자로 정렬하려면 아래와 같이 compareFunction 을 넘겨주면 된다. [1, 5, 10, 20].sort((a, b) => a - b); 기존에 비슷한 코드도 확인해봐야겠다... 논의: 우린 유틸리티 모듈로 언더스코어(underscore.js)를 쓰고 있는데, 언더스코어의 _.sortBy 는 의도대로 숫자로 정렬된다. 코드를 확인해보니, 기본 c..
발생일: 2019.03.01 키워드: node, npm 문제: code EBADKEY invalid config key requested: config npm install 할 때, 위 문구가 나오면서 설치되지 않는다. 해결책: 검색해서 몇 가지 방법을 시도해봤는데, 잘 되지 않았다. 노드 관련 파일을 모두 제거 후에 다시 설치했다. - 루트 node_modules 제거 npm 루트 경로는 아래 명령으로 찾으면 된다 $ npm root -g # npm - node 제거 노드 파일은 아래 명령으로 찾으면 된다 $ type node - n 으로 노드 신규 설치 $ curl -L https://git.io/n-install | bash 오랜만에 깨끗해졌다~ ㅎㅎ
발생일: 2018.10.22 키워드: JSON.stringify, RangeError, Invalid string length, max-old-space-size, 메모리 부족, RangeError 문제: 배치 작업 과정 중에 아래와 같은 오류가 발생하면서 프로세스가 종료됐다. RangeError: Invalid string length at JSON.stringify () 메모리 이슈인 것 같아 노드의 max-old-space-size 파라미터로 힙 사이즈를 필요한 만큼 지정해 실행했는데도 동일하게 발생한다. 왜 그런 걸까? 해결책: 확인해보니, V8은 구조적 문제로 객체의 크기를 1.9기가로 제한하고 있다고 한다. 사이즈가 큰 객체를 stringify 하는 과정에서 문자열의 크기가 지나치게 커진 것이..
발생일: 2018.09.03 키워드: euc-kr, euckr, node.js, iconv, 인코딩, encoding, escape, encodeURIComponent 문제: 노드에서 euc-kr 로 인코딩 된 페이지로 GET 요청을 보내려고 한다. 한글이 포함된 값을 파라미터로 전송하려고 하는데, 어떻게 인코딩하면 될까? 해결책: iconv 라이브러리를 활용하면 된다. const buffer = iconv.encode('한글이 포함된 파라미터', 'euckr'); // 파라미터를 euc-kr 로 인코딩 해 버퍼에 담은 후, const param = encode(buffer.toString('binary')); // 바이너리로 변환해 이스케이프하면 된다. 논의: encodeURI() 와 encodeURI..
발생일: 2019.09.27 키워드: node, npm install, n, asyncWrite 문제: npm install 로 모듈을 설치할 때 아래와 같은 오류가 발생한다. npm ERR! asyncWrite is not a function npm ERR! pna.nextTick is not a function 해결책: npm 을 재설치하는 방법으로 해결했다. $ curl -0 -L https://npmjs.com/install.sh | sudo sh 논의: npm 모듈의 캐시도 날려보고 $ sudo npm cache clean -f node 관리 모듈인 n을 재설치하기도 하고, node 를 stable 버전으로 새로 갱신하기도 했는데 해결되지 않았다. 다른 사람들은 이런 방법으로도 해결된 것 같으니..
발생일: 2018.09.20 키워드: reverse, array, iOS, macOS, safari, javascript array bug 문제: 옆자리 C가 사파리 12버전에서 Array.prototype.reverse() 버그가 발견됐다며 클리앙의 포스트를 공유해줬다. https://www.clien.net/service/board/news/12614248?po=0&od=T31&sk=&sv=&category=&groupCd=&articlePeriod=default&pt=0 배열을 선언하고 reverse()를 호출한 후에, 페이지를 새로고침 했을 때 해당 변수의 배열이 reverse() 된 체 남아있는 버그다. 에이 설마. 이런 빅버그가... 해결책: 오잉잉. 버그가 맞다. 클리앙 글에 참조되어 있는 ..
발생일: 2018.09.19 키워드: json, object, Map 문제: 배치 작업에서 약 천만 행의 데이터를 로드에 객체의 프로퍼티로 할당하는 작업을 진행하고 있었다. 대략 다음과 같이 DB에서 데이터를 읽어와 메모리에 할당하는 간단한 작업이다. readFromDatabase().then((result) => { const map = {}; const list = []; result.forEach((item) => { map[item.id] = item.value; // (A) list.push(item); // (B) }); }); 헌데, 특정 시점(문제가 발생했던 데이터의 경우 약 700만 라인 즈음)부터 (A) 부분의 작업이 1초 이상 걸린다. 하지만 배열에 추가하는 (B) 코드는 아무 문제가..
발생일: 2017.01.09 키워드: Readline, WriteStream, ReadStream, highWaterMark 문제: 한 행에 JSON 포맷의 데이터를 포함한 파일을 CSV 파일로 변환하려고 한다. 파일 사이즈가 커서 readline을 사용해 스트림으로 읽어 변환 후 다시 스트림으로 쓸 생각이다. WriteStream에 'drain' 이벤트가 있던데, 정확히 어떤 이벤트일까? 해결책: highWaterMark(내부 버퍼에 저장할 최대 바이트)에 지정한 값보다 큰 버퍼를 쓰려고 할 땐, write()가 false를 리턴한다. 스트림이 빠져나가는 동안 write()를 호출하면, 청크가 버퍼링되고 false가 리턴된다. 현재 버퍼링된 모든 청크가 빠져나가면 'drain' 이벤트가 발생한다. wr..
발생일: 2016.11.11 키워드: phantomjs, jsdom, cheerio 문제: DOM 파싱을 위한 몇 가지 유명한 노드 모듈이 있다. phantomjs, jsdom, cheerio 이고, 우리 프로젝트에서도 골고루 사용하고 있다. 어떻게 구분해 사용하면 좋을까? 해결책: 이렇게 접근하면 되겠다.ㅎㅎ 1. DOM 파싱이 필요하다면 cheerio, 2. 여기에 더해 헤드리스 브라우저가 필요하다면 jsdom 3. 여기에 더해 렌더링이 필요하다면 phantomjs