我有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端的某个地方。但我不知道在哪里寻找。
提前感谢任何提示。
答案 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,所以我不知道这方面可能出现的问题。