2014-09-30 193 views
2

我有PHP腳本,充當DNode客戶端。然後我有Node.js Dnode服務器,用於評估從PHP客戶端接收到的代碼,並將其作爲HTML返回。然而,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 ......如果沒有任何變化,那麼你最終不會看到任何東西,因爲除了html/head/body標籤。這是值得你花時間確認你得到一個空迴應,它不只是一個空的DOM。

這就是說,eval函數有任何你想要在上面聲明的document/window上執行它的上下文。實際上,它只是在node本身的上下文中執行,而不是在您嘗試創建的頁面上執行。爲了解決這個問題,請嘗試使用:

window.eval(n)

如果你看看例子Creating a browser-like window object GitHub的頁面上jsdom,這會給你的究竟如何使用這個包一個更好的主意。

https://github.com/tmpvar/jsdom

你有什麼之上應該是這個樣子:

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

window.eval(n); 

var html = jsdom.serializeDocument(document); 

cb(html); 

現在,您將在DOM可以執行JavaScript您以前創建:-)

+1

謝謝你,你已經釘了它。現在它按預期工作! – Frodik 2014-10-08 05:15:56

0

你的問題不在Node中。當我使用你展示服務器代碼在你的問題以及與此客戶端代碼嘗試,我得到預期的結果:

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,所以我不知道這個問題可能是在什麼側。

相關問題