1

我試圖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

回答

1

不能從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

相關問題