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

时间:2014-09-30 07:04:19

标签: javascript php node.js dnode

我有PHP脚本充当DNode客户端。然后我有Node.js Dnode服务器,它评估从PHP客户端接收的代码并返回DOM作为HTML。但是,Node.js对我来说很奇怪(就像一个Node.js新手)。即使返回的字符串不为空,它也不会返回任何内容。我的代码如下:

使用DNode-PHP library的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输出&#34; test&#34;。所以问题必须在Node.js端的某个地方。但我不知道在哪里寻找。

提前感谢任何提示。

2 个答案:

答案 0 :(得分:1)

您如何查看回复?通过网络浏览器?如果是这样,那么你依赖于你在eval(n)中评估的任何内容来改变文档的DOM ...如果没有任何变化,那么你最终都不会看到任何东西,因为你会有一个空的除html/head/body标记之外的DOM。值得您花时间确认您的回复是空的,而且它不仅仅是一个空的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 :(得分: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,所以我不知道这方面可能出现的问题。