【问题标题】:Why Node.js function doesn't return JSDom serializeDocument result?为什么 Node.js 函数不返回 JSDom serializeDocument 结果?
【发布时间】:2014-09-30 07:04:19
【问题描述】:

我有充当 DNode 客户端的 PHP 脚本。然后我有 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() 清楚地输出&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;a&gt;&lt;/a&gt;&lt;/body&gt;&lt;/html&gt; 预期的结果。但它永远不会到达 PHP 客户端。但奇怪的是,如果我将cb(html); 更改为cb('test');,PHP 会输出“test”。所以问题一定出在 Node.js 方面。但我不知道去哪里找。

提前感谢任何提示。

【问题讨论】:

    标签: javascript php node.js dnode


    【解决方案1】:

    您如何看待回复?通过网络浏览器?如果是这样,那么您将取决于您在 eval(n) 中评估的任何内容来更改文档的 DOM ...比html/head/body 标签。值得您花时间确认您收到的是空响应,而不仅仅是空 DOM。

    话虽如此,eval 函数有任何你想在上面声明的document/window 上执行它的上下文。事实上,它只是在node 本身的上下文中执行,而不是在您尝试创建的页面上。要解决此问题,请尝试使用:

    window.eval(n)

    如果您在 Github 页面上查看 jsdom 的示例 Creating a browser-like window object ,这将使您更好地了解如何使用此包。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 2021-08-23
        • 2021-11-16
        • 2014-10-23
        相关资源
        最近更新 更多