我尝试浏览此节点js脚本:
var phantom = require('phantom')
phantom.create(function(ph) {
ph.createPage(function(page) {
page.open("editor.html", function(status) {
console.log("opened diagram? ", status);
page.evaluate(function() {
return document.getElementById("GraphImage").src;
}, function(result) {
//console.log(result);
ph.exit();
});
});
});
});
所以我使用了这个命令:
browserify myscript.js > bundle.js
当我从html文件运行bundle.js时,我收到此错误:
http.createServer is not a function
似乎browserify不支持httpserver。我该如何解决这个问题?
答案 0 :(得分:1)
您无法在网络浏览器中运行网络服务器。浏览器中没有任何东西可以像Node的http
模块那样运行。在浏览器中运行PhantomJS也没有意义,因为PhantomJS 是一个Web浏览器。
您想要完成的行为是什么?
更新
您似乎正在尝试在浏览器中运行针对Node.js的代码。
浏览器中的JavaScript引擎比Node.js中的限制性更强,例如出于安全原因,您无法从浏览器内部访问文件系统(否则您可以阅读任何人的硬盘驱动器)访问了您的网页)。
Browserify会include some "shims"将小型JS库放入您在浏览器中工作的代码并与Node.js的API匹配,从而允许某些 Node.js特定的JS代码执行在浏览器中。
在您的情况下,您需要Phantom
,而这似乎又需要http
。根据Browserify文档,它会看到require('http')
并包含a shim for the http module(因为浏览器不提供自己的http
模块。
然后Phantom
模块会尝试调用http.createServer()
,但要注意该http垫片的文档:
除了http.METHODS和http.STATUS_CODES之外,该模块还实现了http.request,http.get和大部分http.ClientRequest和http.IncomingMessage。
所以垫片不支持http.createServer()
。这也是有道理的,因为浏览器永远不会让你自己打开一个http服务器,否则导航到某个人的网站可能会导致你的浏览器开始向外界提供内容,这显然不会有道理。
在你的评论中:
"我希望我的节点js脚本可以从另一个JS代码执行"
你没有指定"其他JS代码"正在运行。如果该JS代码已在Node中运行,那么您根本不需要Browserify。如果您正在尝试使用Web浏览器启动实际的Node.js进程,那么出于明显的安全原因,这不会发生,因为浏览到网页不应该具有运行的能力系统上的任何可执行文件。
Browserify让你做的是获取最初用于Node.js的代码,并在浏览器中运行它,但在运行时它在浏览器中执行,而不是在Node.js中执行,所以你只能使用JS代码在浏览器的JS运行时限制范围内工作。
如果您尝试在Node.js中执行代码,那么您需要通过从命令行启动Node.js可执行文件或通过让另一个程序为您启动进程来实现这一点,但是无法在网络浏览器中完成。如果您尝试让用户导航到您的网站,然后让这些代码在他们的计算机上在浏览器中而不是在Node.js中运行,那么您只需要使用在浏览器中工作的模块。