1

Я пытался browserify этого узла сценария: расслоение плотной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 

кажется, что браузер не поддерживает httpserver. Как я могу решить эту проблему?

+2

Browsify также, вероятно, не поддерживает PhantomJS, потому что это полный браузер и не должен запускаться в другом браузере. –

+0

спасибо, но как я могу запустить js-скрипт узла из кода javascript, не используя командную строку – Amouna

ответ

1

Вы не можете запустить веб-сервер из веб-браузера. В браузере действительно нет ничего, что могло бы действовать как модуль Node http. Также не имеет смысла запускать PhantomJS в браузере, потому что PhantomJS является веб-браузером.

Какое желаемое поведение вы пытаетесь достичь?


Update:

Похоже, вы пытаетесь запустить код, предназначенный для Node.js внутри браузера.

JavaScript-движок внутри браузера гораздо более ограничительный, чем в Node.js, например, вы не можете получить доступ к файловой системе из браузера из соображений безопасности (иначе вы могли бы прочитать жесткий диск любого, кто посетил вашей веб-странице).

Browserify делает include some "shims", что поставит мелкие JS библиотек в код, который работает в браузере и соответствовать API из Node.js, что позволяет некоторые Node.js специфического JS кода для выполнения в браузере.

В вашем случае требуется Phantom, который, как представляется, в свою очередь требует http. В соответствии с документацией Browserify он увидит require('http') и включит a shim for the http module (потому что браузер не предоставляет собственный модуль http).

Модуль Phantom затем пытается вызвать http.createServer() но к Согласно наблюдениям документации к 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 вообще. Если вы пытаетесь запустить веб-браузер в реальном процессе Node.js, это не произойдет, опять же по очевидным соображениям безопасности, поскольку просмотр веб-страницы не должен иметь возможности запускать любой исполняемый файл на вашем система.

Что Browserify позволяет вам сделать, это взять код, первоначально предназначенный для узла.js и запускать его в браузере вместо этого, но t runtime выполняется в браузере, а не в Node.js, поэтому вы можете использовать только JS-код, который работает в рамках ограничений среды выполнения JS браузера.

Если вы пытаетесь выполнить свой код в Node.js, вам нужно сделать это, если что-то запустило исполняемый файл Node.js либо из командной строки, либо путем запуска другой программы для вас, но что невозможно сделать из веб-браузера. Если вы пытаетесь заставить пользователей перейти на ваш веб-сайт, а затем запустить этот код на своих машинах в браузере, а не в Node.js, вам нужно использовать только модули, которые работают в браузере.

+0

Я хочу, чтобы иметь возможность запускать скрипт js узла без использования командной строки без выполнения «node myscript.js», я хочу что мой скрипт js узла может быть выполнен из другого JS-кода, поэтому я использую браузеру! есть другое решение, пожалуйста? – Amouna

+0

@Amouna Я обновил свой ответ, чтобы надеяться на то, что вы можете и не можете сделать больше. – CodingWithSpike

+0

Привет, спасибо, я хочу выполнить свой javascript-узел сценария без командной строки, я хочу вызвать мой скрипт js-скрипта из javascript-программы, как это, поэтому я пользуюсь браузером. <сценарий SRC = «myscript.js»> Я хочу, чтобы иметь возможность вызывать сценарий моего узла из расслоения плотного яваскрипта программы, и это один вызова в командной строке на фоне и отображение результата. – Amouna

Смежные вопросы