2014-10-22 2 views
0

Это страница моего приложения Nodejs Express, routers/index.js page Я пытаюсь разобрать некоторые сайты - вот две части кода: пример. После получения страницы я использую модуль jsdom для работы с данными. Но есть одна проблема - othersite.com в этом примере отлично работает, в то время как site.com падает после разбора и отображения страницы (как мне кажется) с ошибкой:nodejs jsdom TypeError: Object [object global] не имеет метода 'postMessage'

http://s7.addthis.com/static/r07/core159.js:4 
){!_ate.bro.ie6&&!_ate.bro.ie7&&W&&W.contentWindow&&W.contentWindow.postMessag 
                    ^
TypeError: Object [object global] has no method 'postMessage' 
    at Object.r [as msg] (http://s7.addthis.com/static/r07/core159.js:4:6291) 
    at Object.window._ate.m.initPostMessage (http://s7.addthis.com/static/r07/core159.js:7:11410) 
    at null._onTimeout (http://s7.addthis.com/static/r07/core159.js:7:7874) 
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) 

Есть другие условные блоки, производят ту же ошибку, хотя там не так много кода.
Может ли кто-нибудь сказать мне, в чем проблема?

router.get('/', function(req, res) { 
var url_parts = url.parse(req.url, true), 
    query = url_parts.query, 
    video_url, 
    file_url, 
    videoTitle, 
    embedCode, 
    remoteAddr = req.connection.remoteAddress, 
    base64_encode = require('base64').encode; 
if (query.link) { 
     var pathObj = url.parse(query.link, true); 
     var options = { 
      host: pathObj.host, 
      port: 80, 
      path: pathObj.path, 
      headers: { 
       "X-forwarder-for" : "90.90.90.90" // just sample ip 
      } 
     }; 
     http.get(options, function(response){ 

      var allChunk = ''; 
      response.on('data', function(chunk) { 
        allChunk += chunk; 
      }); 
      response.on('end', function(){ 
       var doc = jsdom.jsdom(allChunk); 
       var serializedChunk = doc.documentElement.outerHTML; 
       jsdom.env(
        serializedChunk, 
        ["http://code.jquery.com/jquery.js"], 
        function (errors, window) { 
         remoteAddr = remoteAddr; 
         videoTitle = window.$('title').text(); 
         var rawHtml = window.$('body').html(); 
         var handler = new htmlparser.DefaultHandler(function (error, dom) {}); 
         var parser = new htmlparser.Parser(handler); 
         parser.parseComplete(rawHtml); 
         var objectDom = handler.dom; 
         if (query.link.indexOf('site.com') != -1) { 
          var blockHTML = window.$('#player embed').attr('flashvars'); 
          var flash_vars_url = url.parse('/?' + blockHTML, true); 
          var queryFlashVars = flash_vars_url.query; 
          file_url = queryFlashVars.flv_url; 
          embedCode = window.$('input[name="media_embed_code"]').val(); 
          res.render('link', { title: 'source link', link: file_url, videoTitle: videoTitle, embedCode: embedCode, sourceLink: query.link }); 
         } else if (query.link.indexOf('othersite.com') != -1) { 
          file_url = window.$('.downloadList li a').attr('href'); 
          var embedObject = /\$\('#clip_text'\).val\(*"([^"]*)/g.exec(rawHtml); 
          embedCode = embedObject[1]; 
          res.render('link', { title: 'source link', link: file_url, videoTitle: videoTitle, embedCode: embedCode, sourceLink: query.link }); 

         } else { 
          res.status(404); 
          res.render('error', { 
           message: 'Not found', 
           error: {} 
          }); 
         } 

        } 
       ); 

      }); 
     }).on("error", function(e){ 
      console.log("Got error: " + e.message); 
     }).end(); 
} else { 
    res.render('index', { title: 'title' }); 
} 

});

Буду благодарен за любую помощь.

ответ

0

Ну как вы можете видеть ошибки Описание:

Вы пытаетесь вызвать ate.bro.ie6 & & _ate.bro.ie7 & & W & & W.contentWindow & & W.contentWindow.postMessage

Но в окне содержимого такого метода нет. Возможная причина, по которой вы что-то загружаете и перезаписываете этот модуль.

В исходном условии (и из-за обфускации http://s7.addthis.com/static/r07/core159.js) Я вижу, что это его некоторая библиотека на стороне сервера, которая, похоже, эмулирует поведение объекта окна «Браузер» ... Но вы разрушили контекст окна, чтобы он не смог работать.

Я думаю here аналогичный вопрос

0

Он смотрит на меня, как есть код, который пытается выполнить window.postMessage и этот метод не существует в jsdom. Этот код проверяет, является ли window.postMessage можно назвать вообще:

var jsdom = require("jsdom"); 

var document = jsdom.env({ 
    html: "<html><head><script>window.postMessage();</script></head><body></body></html>", 
    features: { 
     FetchExternalResources: ["script"], 
     ProcessExternalResources: ["script"] 
    }, 
    done: function (errors, w) { 
     console.log(errors); 
    } 
}); 

Производит этот вывод:

[ { type: 'error', 
    message: 'Running file:///tmp/t2/test.js:undefined:undefined<script> failed.', 
    data: 
    { error: [TypeError: Object [object global] has no method 'postMessage'], 
     filename: 'file:///tmp/t2/test.js:undefined:undefined<script>' } } ] 

Я также проверил код:

$ npm install jsdom 
$ cd node_modules/jsdom 
$ grep postMessage `find . -type f` 
[no results]