2014-09-22 7 views
0

이 경로로 인해 서버의 메모리가 서서히 소모되어 그 이유를 알 수 없습니다. 어리석은 exec() 표현과 구문 분석은 대상 URL의 고대 SSL 버전 때문에 필요하며 노드 SSL 라이브러리를 신뢰하거나 무시할 수 없습니다. 이 코드 개선에 대한 추가 제안 사항은 언제든지 환영합니다.NodeJS 메모리 누수

(function() { 
    var exec, express, fs, https, jsdom, qs, router, util; 

    express = require("express"); 
    jsdom = require('jsdom'); 
    exec = require('exec'); 
    https = require('https'); 
    qs = require('querystring'); 
    fs = require('fs'); 
    util = require('util'); 

    router = express.Router(); 

    router.get("/getVars", function(req, res) { 
    res.set({ 
     "Cache-Control": 'max-age=86400' 
    }); 
    return exec("curl -m 6 -1 'https://some.url.com'", function(err, b, stderr) { 
     if (b) { 
     return jsdom.env(b, ["http://code.jquery.com/jquery.js"], function(err, window) { 
      var eventvalidation, viewstate; 
      viewstate = window.$("#__VIEWSTATE").val(); 
      eventvalidation = window.$("#__EVENTVALIDATION").val(); 
      return res.json({ 
      viewstate: viewstate, 
      eventvalidation: eventvalidation 
      }); 
     }); 
     } else { 
     return res.json({ 
      viewstate: "verylongstring", 
      eventvalidation: "verylongstring" 
     }); 
     } 
    }); 
    }); 

... 
+0

이 방법이 도움이 될지 모르지만 [node-memwatch] (https://github.com/lloyd/node-memwatch)를 사용해 보았습니까? – incutonez

+1

[HTTPS 요청] (http://nodejs.org/api/https.html#https_https_request_options_callback)에서 'secureProtocol' 플래그로 지정할 수있는 TLSv1을 사용하려는 것 같습니다. 사용자 지정 에이전트를 만들거나 에이전트를 사용하지 않아도 사용할 수있는 것처럼 보입니다. – incutonez

+0

DOM을 사용하는 것을 피할 수있는 사람은 아니지만, 단지 regexp를 사용하여 viewstate 데이터를 얻고, jsdom 대신에 eventvalidation을 사용해야합니다 (크기는 크지 만 ...). 그들은 base64 문자열이어야하며 예측 가능해야합니다. – Tracker1

답변

1

나는 그것이 가능성이 더 나은 정규 표현식의 부부와 함께 제공 될 것입니다 귀하의 제한 요구에 매우 무거운 구성 요소의로 jsdom 제거 좋을 것, 아래를 참조하십시오.

... 
    return res.json(getDataFromString(b || '')); 
    ... 

function getDataFromString(input){ 
    return { 
    viewstate: (/id=\"__VIEWSTATE\" value=\"([^\"]*)\"/).exec(input)[1] || "verylongstring", 
    eventvalidation: (/id=\"__EVENTVALIDATION\" value=\"([^\"]*)\"/).exec(input)[1] || "verylongstring" 
    } 
}
+1

이벤트 검증을 위해 viewstate '/ id = \ "에 대한 – Tracker1

+0

팁 주셔서 감사합니다. 오늘 시도하고 다시보고 드리겠습니다. – mz3

+0

지금은 1 조 배나 더 좋습니다. – mz3