为什么Node.js函数不返回JSDom的serializeDocument结果?

我有PHP脚本作为一个DNode客户端。 然后,我有Node.js Dnode服务器,它评估从PHP客户端接收到的代码,并将其作为HTML返回。 然而,Node.js奇怪地对我(对一个Node.js新手)。 它不返回任何东西,即使返回的string不是空的。 我的代码如下:

使用DNode-PHP库的 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输出“testing”。 所以这个问题必须在Node.js的某个地方。 但我不知道在哪里寻找。

预先感谢任何提示。

你如何看待回复? 通过networking浏览器? 如果是这样,那么你依赖于你在eval(n)任何改变来改变文档的DOM …如果没有改变,那么你将不会看到任何东西,因为你将有一个空的DOM除了html/head/body标签之外。 这是值得你的时间确认你得到一个空的回应,它不只是一个空的DOM。

这就是说, eval函数有任何你想要在上面声明的document/window上执行它的上下文。 实际上,它只是在node本身的上下文中执行,而不是在您正在尝试创build的页面上执行。 要解决这个问题,请尝试使用:

window.eval(n)

如果你看看在Github页面上为jsdom Creating a browser-like window objectjsdom ,这会让你更好地了解如何使用这个包。

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

现在,您将在以前创build的DOM上执行Javascript 🙂

你的问题不在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,所以我不知道这个问题可能是什么。