2

DNode クライアントとして機能する PHP スクリプトがあります。次に、PHPクライアントから受け取ったコードを評価し、DOMをHTMLとして返すNode.js Dnodeサーバーがあります。ただし、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);

<!DOCTYPE html><html><head></head><body><a></a></body></html>Console.log()は、期待される結果を明確に出力します。しかし、PHP クライアントには到達しません。しかし奇妙なことに、行cb(html);をに変更するとcb('test');、PHP は "test" を出力します。したがって、問題は Node.js 側のどこかにあるはずです。しかし、私はどこを探すべきかわかりません。

ヒントをお寄せいただきありがとうございます。

4

2 に答える 2

1

回答をどう見ていますか?ウェブブラウザ経由?その場合、ドキュメントの DOM を変更するために評価しているものに依存しています...何も変わらない場合は、タグ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 を実行します :-)

于 2014-10-04T19:57:46.663 に答える