2014-09-30 3 views
2

DNode 클라이언트 역할을하는 PHP 스크립트가 있습니다. 그렇다면 PHP 클라이언트에서받는 코드를 평가하고 DOM을 HTML로 반환하는 Node.js Dnode 서버가 있습니다. 그러나 Node.js는 나에게 이상하게 행동합니다 (Node.js 초보자에게만 해당). 반환 문자열이 비어 있지 않아도 아무 것도 반환하지 않습니다. 내 코드는 다음과 같습니다 : DNode-PHP library를 사용Node.js 함수가 JSDom serializeDocument 결과를 반환하지 않는 이유는 무엇입니까?

PHP 클라이언트 코드 :

<?php 
    require(__DIR__.'/../../vendor/autoload.php'); 
    $loop = new React\EventLoop\StreamSelectLoop(); 
    $dnode = new DNode\DNode($loop); 
    $dnode->connect(7070, function($remote, $connection) { 
    $js = 'var a = document.createElement("A");'; 
    $js.= 'document.getElementsByTagName("body")[0].appendChild(a);' 
    $remote->zing($js, function($n) use ($connection) { 
     print_r($n); 
     $connection->end(); 
    }); 
}); 
$loop->run(); 
?> 

Node.js를 서버 코드 :

var dnode = require('dnode'); 
var jsdom = require("jsdom"); 
var server = dnode({ 
    zing: function (n, cb) { 
    var document = jsdom.jsdom('<!DOCTYPE html>'); 
    var window = jsdom.parentWindow; 
    eval(n); 
    var html = jsdom.serializeDocument(document); 
    // console.log(html); 
    cb(html); 
    } 
}); 
server.listen(7070); 

을 console.log() 명확하게 결과를 예상 무엇 <!DOCTYPE html><html><head></head><body><a></a></body></html>를 출력합니다. 그러나 결코 PHP 클라이언트에 도달하지 않습니다. 그러나 무엇이 이상한 지, cb(html);cb('test');으로 변경하면 PHP는 "test"를 출력합니다. 따라서 문제는 Node.js의 어딘가에 있어야합니다. 그러나 나는 어디에서 찾을 지 모른다.

미리 알려 주셔서 감사합니다.

답변

1

응답을 어떻게보고 있습니까? 웹 브라우저를 통해? 그렇다면 eval(n)에서 DOM의 문서를 변경하려면 무엇을 사용 하느냐에 달려 있습니다. 아무 것도 변경되지 않으면 DOM 이외의 빈 DOM을 갖기 때문에 아무 것도 볼 수 없습니다. html/head/body 태그. 빈 응답을 되찾고 빈 DOM 만있는 것은 아니라는 것을 확인하는 것이 가치가 있습니다.

그런데, eval 함수는 위에서 선언 한 document/window에서 함수를 실행하려는 컨텍스트를 가지고 있습니다. 그대로, 그것은 시도하고있는 페이지에서가 아니라 node 자체의 컨텍스트에서 실행 중일뿐입니다. 이 문제를 해결하려면 사용해보십시오 :

window.eval(n)

당신이 jsdom의 Github에서 페이지의 예를 Creating a browser-like window object 를 보는 경우에, 이것은 당신이 패키지를 사용하는 방법을 정확하게의 더 나은 아이디어를 줄 것이다.

var document = jsdom.jsdom("<!DOCUMENT html>"); 
var window = document.parentWindow; 

window.eval(n); 

var html = jsdom.serializeDocument(document); 

cb(html); 

지금 당신은 당신이 이전에 :-)

+1

감사합니다. 당신은 그것을 찍었습니다. 이제 예상대로 작동합니다! – Frodik

0

문제를 생성 된 DOM에서 자바 스크립트를 실행 할 수 있습니다 : 당신의 모양은 위가 무엇

https://github.com/tmpvar/jsdom

노드에 없습니다. 그래서 문제가에있을 수 있습니다 모르겠어요

var dnode = require("dnode"); 

var d = dnode(); 
d.on('remote', function (remote) { 
    var js = 'var a = document.createElement("A");' + 
      'document.getElementsByTagName("body")[0].appendChild(a);'; 
    remote.zing(js, function (s) { 
     console.log(s); 
    }); 
}); 
d.connect('localhost', '7070'); 

내가 PHP를하지 않는다 : 나는 귀하의 질문에 당신이 보여 서버 코드를 사용하여이 클라이언트 코드를하려고하면, 내가 예상 결과를 얻을 수 측면.

관련 문제