browserify错误:http.createServer不是一个函数

browserify错误:http.createServer不是一个函数

问题描述:

我试图browserify这个节点js脚本:browserify错误:http.createServer不是一个函数

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 

,当我运行从bundle.js一个html文件我得到这个错误:

http.createServer is not a function 

似乎browserify不支持httpserver。我该如何解决这个问题?

+2

browserify也可能不支持PhantomJS,因为它是一个完整的浏览器,不应该在另一个浏览器中运行。 –

+0

谢谢,但我怎么能从一个JavaScript代码运行节点js脚本,而不使用命令提示符 – Amouna

不能从Web浏览器中运行的Web服务器。浏览器中没有任何东西可以像Node的http模块那样工作。此外,它没有意义在浏览器中运行PhantomJS,因为PhantomJS Web浏览器。

什么是你所要完成所期望的行为?


更新:

好像你正试图在浏览器中运行用于Node.js的代码来代替。

浏览器内部的JavaScript引擎比Node.js更受限制,例如,出于安全原因,您无法从浏览器内部访问文件系统(否则您可以读取访问过任何人的硬盘驱动器你的网页)。

Browserify确实include some "shims",将放在小JS库到您的代码,在浏览器中运行和匹配的Node.js的API,允许一些 Node.js的具体JS代码在浏览器中执行。

在你的情况,你需要Phantom,这似乎又需要http。 Accoring到Browserify文件,它会看到require('http'),包括a shim for the http module(因为浏览器不提供http模块自己的)。

Phantom模块,然后试图调用http.createServer()但accoring针对该HTTP垫片的文档:

This module implements http.request, http.get, and most of http.ClientRequest and http.IncomingMessage in addition to http.METHODS and http.STATUS_CODES.

所以http.createServer()不被垫片支持。这也是有道理的,因为浏览器永远不会让你在自己内部打开http服务器,否则导航到某个人的网站可能会导致你的浏览器开始向外界提供内容,这显然没有意义。

在您的评论:

"i want that my node js script can be executed from another JS code"

您没有指定什么“等JS代码”在运行如果JS代码已经在节点上运行,那么你不需要Browserify可言。如果您试图让Web浏览器启动一个实际的Node.js进程,这种情况不会发生,这是出于明显的安全原因,因为浏览到网页应该无法在您的系统上运行任何可执行文件系统。

什么Browserify让你做的是采取代码最初是为节点。js,然后在浏览器中运行它,而不是在浏览器中执行,而不是在Node.js中执行,因此您只能使用在浏览器的JS运行时约束下工作的JS代码。

如果您试图在Node.js中执行代码,那么您需要通过启动Node.js可执行文件(无论是从命令行还是让另一个程序为您启动该进程)来执行此操作,但这不能在网络浏览器中完成。如果您试图让用户导航到您的网站,然后让这些代码在浏览器中而不是Node.js中的计算机上运行,​​那么您只需要使用在浏览器中工作的模块。

+0

我希望能够运行我的节点js脚本,而不使用命令提示符而不做“节点myscript.js”,我想要我的节点js脚本可以从另一个JS代码执行,这就是为什么我使用browserify!有其他解决方案吗? – Amouna

+0

@Amouna我更新了我的答案,希望能够让你更多地了解你能做什么,不能做什么。 – CodingWithSpike

+0

嗨,谢谢,我想执行我的脚本节点js没有命令提示符,我想从这样的JavaScript程序调用我的节点js脚本,这就是为什么我使用browserify。

我希望能够从一个JavaScript程序调用我节点JS脚本和这一个呼叫上背景命令提示和显示结果。 – Amouna