2

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

使用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 会输出“test”。所以问题一定出在 Node.js 方面。但我不知道在哪里寻找。

提前感谢您的任何提示。

4

2 回答 2

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

于 2014-10-04T19:57:46.663 回答
0

您的问题不在 Node.js 中。当我使用您在问题中显示的服务器代码并尝试使用此客户端代码时,我得到了预期的结果:

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,所以我不知道那方面的问题可能是什么。

于 2014-10-07T23:38:52.520 回答