2010-12-07 4 views
1

내가 예에서 간단한 코드를 실행하려고 Node.js를 :이상한 오류가

require.paths.unshift('/etc/npm'); // path to modules 
var httpAgent = require('http-agent'), 
    jsdom = require('jsdom'), 
    sys = require('sys'); 

var agent = httpAgent.create('www.twitter.com', ['', 'about']); 

agent.addListener('next', function (e, agent) { 
    var body = agent.body; 
    var window = jsdom.jsdom(body, {},{}).createWindow(); 
    jsdom.jQueryify(window, 'http://code.jquery.com/jquery-1.4.2.js', function (window, jquery) { 
    agent.next(); 
    }); 
}); 

agent.addListener('stop', function (agent) { 
    sys.puts('the agent has stopped'); 
}); 

agent.start(); 

을하지만이 라인에 많은 오류를 반환

var window = jsdom.jsdom(body, {},{}).createWindow(); 

하는 오류 :

[email protected]:~/node$ node test.js 

/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom/browser/index.js:197 
    if (!dom.HTMLDocument.write) { 
        ^
TypeError: Cannot read property 'write' of undefined 
    at Object.browserAugmentation (/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom/browser/index.js:197:24) 
    at Object.jsdom (/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom.js:15:25) 
    at EventEmitter.<anonymous> (/home/kir/node/test.js:12:22) 
    at EventEmitter.emit (events:27:15) 
    at Object.emit (/usr/local/lib/node/.npm/http-agent/0.1.0/package/lib/http-agent.js:180:41) 
    at /usr/local/lib/node/.npm/http-agent/0.1.0/package/lib/http-agent.js:145:14 
    at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/request/0.10.0/package/lib/main.js:89:7) 
    at IncomingMessage.emit (events:41:20) 
    at HTTPParser.onMessageComplete (http:107:23) 
    at Client.onData [as ondata] (http:848:27) 

안정적인 node.js 0.2.5가있는 Ubuntu 10.10이 있습니다. WTF?

답변

7

정상적인 jsom은 진행 중이며 DOM API는 거대하며 모든 브라우저 단점을 다시 구현하는 데 많은 시간이 걸립니다. 그냥 기본 하나에 후퇴 할 null을 통과

그러나 jsdom.jsdom(body, {},{}).createWindow();이 잘못 우선 전화로, 두 번째 매개 변수는 하나를 제공하지 않는 경우 완전히, DOM 객체를 구성해야합니다.

하지만 그 후에는 거북이가 완전히 내립니다.

예를 들어이 window.top.location을 수행하면 jsdom이 window.top 및 BOOM을 정의하지 않는다는 사실이 밝혀졌습니다.

고정 중 ... 예, 거북이. 오류가 멈추지 않으면 모든 방법을 수정하는 데 관심이 있다면 <npm folder>/jsdom/0.1.21/package/lib/jsdom/level2/languages/javascript.js을 열어 코드가 작동 할 때까지 코드를 기록하고 window 개체를 수정하면됩니다.

+0

오, 젠장. 나는 사과가 올바르게 작동하고 개발이 끝났다고 사과했다. 웹 페이지를 파싱하려면 PHP를 사용하는 것이 좋습니다. – Kir

3

여기에 설명 된대로 실제 문제는 jsdom (html, {}, {})입니다. jsdom()의 두 번째 인수는 레벨 (level1/core, level2/core, level2/html 등)입니다. 빈 객체를 전달하면 기본적으로 jsdom 메소드가 해당 W3c 레벨없이 작동하도록 지시합니다.

관련 문제