Javascript NodeJSDOM类型错误:对象[Object global]没有方法“postMessage”

Javascript NodeJSDOM类型错误:对象[Object global]没有方法“postMessage”,javascript,node.js,jsdom,Javascript,Node.js,Jsdom,这是我的Nodejs Express应用程序中的一个页面,路由器/index.js页面 我正在尝试解析一些站点-这里有两段代码作为示例。 获取页面后,我使用jsdom模块处理数据。但是有一个问题-本例中的othersite.com工作正常,而site.com在解析和呈现页面后崩溃,在我看来这是一个错误: http://s7.addthis.com/static/r07/core159.js:4 ){!_ate.bro.ie6&&!_ate.bro.ie7&&W&a

这是我的Nodejs Express应用程序中的一个页面,路由器/index.js页面 我正在尝试解析一些站点-这里有两段代码作为示例。 获取页面后,我使用jsdom模块处理数据。但是有一个问题-本例中的othersite.com工作正常,而site.com在解析和呈现页面后崩溃,在我看来这是一个错误:

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' });
}
})


我将非常感谢您的帮助。

您可以从错误描述中看到:

你想打电话给ate.bro.ie6&_ate.bro.ie7&&W&&W.contentWindow&&W.contentWindow.postMessage

但内容窗口并没有这样的方法。可能的原因是您加载了某些内容并覆盖了该模块

在source Provided中,通过对的解模糊处理,我看到服务器端的某个库似乎模拟了浏览器窗口对象行为。。。但是您破坏了windows上下文,因此它无法工作


我认为类似的问题

在我看来,有代码试图执行,而这个方法在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]