node.js 8

[Python] 파이썬 Socket.IO 오류 unexpected response code 400

0. 선 요약 - python-socket.io와 node.js socket.io간 버전 의존성이 있음. - python-socket.io v5, node.js socket.io v2로 낮춰서 통신 수행 - python과 node간 socket 통신은 가능하다. 1. 상황 (1) 서로 떨어진 Node.js와 Python간의 통신을 Socket.Io로 수행. (2) Node.js (서버) socket.io와 Python (client) socket.io 통신시 unexpected respnse code 400 또는 요청이 씹히는 경우가 발생. (3) Connection Refused-연결 거부(서버가 꺼져있는 등의 이유로)가 아님 (4) 기존 프로토타입 테스트때 Python-Node간 통신이 가능함을 확인..

[서버] 우분투 아파치 가상호스트 및 프록시 설정

프록시를 모른다면? [웹 서버] Proxy 서버와 Forward, Reverse 프록시 오늘 드디어 인터넷이 연결되면서, 고정 아이피를 받았다. 그래서 근 2주간 끊겨있던 웹 서버와 기타 서버들을 가동했다. 물론 컴퓨터는 달랑 2대인데 돌려야할 웹 사이트는 여러개고 추가적으로 몇 도메인을 구매하여 계속해서 늘릴 예정이라서, 반드시 한 컴퓨터에 여러 웹사이트를 운영해야한다. 학부 과정일 때(물론 가르쳐준 사람이 없지만..), 80번 포트 == 웹 서버 포트라고 생각해서 항상 1대에 1 사이트만 운영될 수 있는줄 알았다. 물론 깨달은지는 좀 꽤 지났지만, 추가적으로 사용하기 위해 "별도의 노력"이 필요한 상황이 그닥 달갑지 않아서 1 컴퓨터 1 서버를 고수했다. 아무튼 각설하고, 한 컴퓨터에서 여러 서버를 ..

[서버] Node.js Redis Only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context 오류 해결

Socket.io를 이용하여 데이터 크롤링 결과를 실시간으로 뿌려주는 기능을 구현하였다. 물론 Node.js를 두개로 나누어 웹 서비스용과 데이터 크롤링 및 전송용으로 나눠서 사용했지만, Node.js http request 모듈이 특정 사이트에 가면 timeout이 생기는 문제가 발생했다.(Node.js가 Non-blocking이 아니었나..) 그래서 서버를 웹 서비스 / 데이터 크롤링 / 데이터 전송 세가지로 나누고, 데이터 크롤링 서버가 데이터를 redis 상에 업데이트 하면 이 정보를 데이터 전송 서버에 전달하도록 구현하는데 redis publish, subscribe를 사용했다. 우선 데이터 크롤링에서 얻은 데이터는 실시간 데이터기 때문에 소실되어도 문제가 크게 없어서, redis pub/sub..

[자바스크립트] Node.js, 자바스크립트 Object(Associative array) 종료 및 콜백

jQuery에서 동일한 DOM의 반복적인 selector를 사용을 방지하기 위해서나, K-V 형식으로 데이터를 저장할때 Object를 많이 사용한다. 이런 Object안에서 전체 Key를 찾아 순회할 때, Object.keys(obj)형식을 많이 사용한다. 특히, Object.keys(obj).forEach(function(k,v){})를 이용하여 Loop 문까지 한번에 처리하는 경우가 많은데, 여기서 Callback을 사용하는 경우 callback 호출후에도 루프가 Break되지 않는 문제가 생긴다. var obj = { 'abc':1 , 'bcd':2'}; function run(obj, callback){ Object.keys(obj).forEach(function(k,v){ if(k == 'abc..

[Node.js / Javascript] 초당 처리 횟수 제한을 위한 윈도우 함수

API 크롤링이나, 기타 데이터 수집을 위해서 함수 또는 특정 프로시저를 실행할 때 횟수제한에 걸리지 않도록 윈도우를 잡아서 처리하는 코드 다만, 이 코드는 setInterval을 사용하므로 CPU 소모량이 클 수 있다. 소스코드 function AWS(limit, secs){ this.list = []; this.limit = limit; this.window = secs*1000; this.push = function(a, b){ this.list.push([-1, a, b]); } this.pop = function(){ if(this.list.length==0) return "EMPTY"; var now = new Date().getTime(); var st = -1; for(var i = 0 ;..

[Node.js] Express-session 기반 로그인 세션 관리시, 로그인 리다이렉트 Ajax 처리

Node.js 상에서 로그인 세션을 관리하는 패키지인 Express-session을 사용하게 되면, 별도의 관리 로직을 구성하지 않아도 알아서 Request와 Response에 로그인 정보를 담아준다. 하지만 로그인에 따라 각 다른 페이지를 구성하거나, 노출 여부를 결정하는 경우라면 각 라우터의 URL 매칭마다 이를 확인해주어야 한다. 매번 똑같은 함수를 계속해서 호출하거나, 복붙 할 수 없으므로 Middleware 형태의 인증 확인 절차를 거친다. 아래와 같은 코드를 많이 보았을 텐데, 실제 이와 같이 처리하게 되면 해당 라우터를 거치는 모든 요청들이 ensureLoggedIn 함수를 거쳐 로그인 여부가 판단되고, 로그인 페이지로 리다이렉트하거나 라우터로 가던길 계속 간다. router.get('/',..

[Node.js] Node.js와 외부 프로그램(Java, C, C++) 연결 (bridge)

서버를 만들다 보면 NPM 패키지에 포함되지 않은 기능이 필요한 경우가 생긴다. 이런 경우, 어쩔수 없이 다른 프로그래밍 언어를 사용해야하는 경우가 발생한다. 또한 성능 문제로 반드시 C,C++를 써야하는 경우가 생기기도 한다. Node.js에서 타 언어 프로그램을 호출하는 경우 여러가지 방법이 있지만, 나의 경우에는 한가지 프로그램만 실행하면 되었기 때문에 child_process 패키지의 exec를 사용했다. (터미널 터맨드와 동일) (1) STDOUT을 이용한 처리 방법 물론 이 방법은 터미널 명령이기 때문에 위험하다. (하지만.. 뭐 소스가 변조되지 않는 이상은 문제가 없을 것이고, 이미 변조 단계에 들어섰다면 서버 소스와 DBMS 정보를 다 털린것과 다름없기 때문에..) var exec = re..

[Node.js] Jade(pug) 템플릿 엔진 속도 문제

요약 : 1. Node.js에서 사용하는 Pug 템플릿 엔진 (Jade)를 이용하면 간단한 페이지도 로드되는데 굉장히 오래 걸린다. 2. 코드를 구성하기 나름이지만, 쿼리 + Pug 컴파일 + 변수 대입 + 요청 응답의 4단계에서 컴파일 타임이 약 8할이상 시간이 걸린다. (응답시간 1초의 경우 약 800ms이상 소요) 3. Pug 엔진에서 캐시가 가능하다. 결과 : 컴파일 시간이 0ms으로, 응답시간이 5배 이상 빨라진다. var fn = pug.compileFile('파일.pug',{ basedir:__dirname, cache:true }); res.writeHead(200, {'Content-Type' : 'text/html'}); res.end(fn(varlist)); 캐시이므로, 서버 켜질때 ..

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사