2014-09-30 200 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,所以我不知道这个问题可能是在什么侧。