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

browserify Error : http.createServer is not a function

本文关键字:一个 函数 错误 http createServer browserify      更新时间:2023-09-26

我试图浏览器化这个节点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。如何解决此问题?

您无法从 Web 浏览器内部运行 Web 服务器。浏览器中确实没有任何东西可以像 Node 的 http 模块一样。在浏览器中运行PhantomJS也没有意义,因为PhantomJS是一个Web浏览器。

您要完成的预期行为是什么?


更新:

您似乎正在尝试在浏览器中运行适用于 Node.js 的代码。

浏览器内部的JavaScript引擎比Node.js中的限制要严格得多,例如,出于安全原因,您无法从浏览器内部访问文件系统(或者您可以读取访问您网页的任何人的硬盘驱动器(。

Browserify确实包含一些"填充码",

这些"填充码"会将小型JS库放入您的代码中,这些库可以在浏览器中工作并与Node.js的API匹配,从而允许一些Node.js特定的JS代码在浏览器中执行。

在您的情况下,您需要Phantom,这似乎反过来需要http。根据 Browserify 文档,它将看到require('http')并包含 http 模块的填充程序(因为浏览器不提供自己的http模块(。

然后,Phantom模块尝试调用http.createServer()但要遵循该 http 填充程序的文档:

该模块实现了http.request,http.get和大部分http。ClientRequest 和 http。除了 http 之外的传入消息。方法和 http。STATUS_CODES。

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

在您的评论中:

"我希望我的节点JS脚本可以从另一个JS代码执行">

您没有指定"其他 JS 代码"正在运行的内容。如果该JS代码已经在Node中运行,那么您根本不需要Browserify。如果您尝试让 Web 浏览器启动实际的 Node.js 进程,这不会发生,同样出于明显的安全原因,因为浏览到网页不应该能够在您的系统上运行任何可执行文件。

Browserify 允许您做的是获取最初用于 Node.js 的代码,并在浏览器中运行它,但它在浏览器中执行 t 运行时,而不是在 Node.js 中执行,因此您只能使用在浏览器 JS 运行时约束下工作的 JS 代码。

如果您尝试在 Node.js 中执行代码,那么您需要通过让某些东西启动 Node.js 可执行文件来做到这一点,无论是从命令行还是让另一个程序为您启动该过程,但这不能从 Web 浏览器中完成。如果您尝试让用户导航到您的网站,然后让此代码在浏览器中而不是在 Node.js 中运行,那么您只需要使用在浏览器中工作的模块。