Как выполнить функцию узла с помощью кнопки html

Я новичок в nodejs, и я хочу писать в последовательный порт, используя node, но теперь я хочу, чтобы он был вызван кнопкой. И данные поступают из текстового поля.
Мой сценарий узла работает нормально, когда я запускаю его в консоли/терминале. Но не может сделать это с помощью кнопки на веб-странице.
Вот мои nodejs, встроенные в html

<!DOCTYPE html>
<html>
<head>
    <title>Node x HTML</title>
</head>
<body>

    <script>
    function write_serial() 
    {
        var serialport = require("serialport");
        var SerialPort = serialport.SerialPort;

        var sp = new SerialPort("/dev/ttyACM0", {
          baudrate: 9600,
          parser: serialport.parsers.readline("n")
        });

            var text = document.getElementById("textbox1").value;

            sp.on('open', function() 
            {
                sp.on('data', function (data) 
                {
                    sp.write(name);
                });
            });
    }

    </script>

    <Input Type = "text" id = "textbox1" >
    <BR>
    <br><button onclick="write_serial();" href="javascript:;">Go!</button>
</body>
</html>

Вот ошибка, которую я получил, когда я открываю консоль страницы (F12)

ReferenceError: require is not defined

Заранее спасибо за помощь. 🙂

3 ответа

  1. Узел.js-это среда размещения, которая может выполнять JS и предоставляет узел.JS специфический API. Браузер, это другая среда хостинга, с различными API. Вы не можете использовать определенный API узла в браузере, и JS, который использует API узла, приведет к ошибке в браузере.

    Например, сценарий использует глобальную requireфункцию, которая недоступна в API браузера. И именно поэтому:

    ReferenceError: require не определен

    И наоборот, сценарий не может быть выполнен на узле, так как он использует API браузера:

    документ.getElementById («textbox1»)

    Вы смешали API из разных сред в одном скрипте.

    Однако если JS-скрипт не использует API, специфичный для узла или браузера, он может быть выполнен как в узле, так и в браузере без ошибки. Но это не относится к вашему сценарию.

    Решением проблемы может быть разделение скрипта на два отдельных скрипта, запуск одного в браузере, а другого в узле.js, и обмениваться данными между ними с помощью XMLHttpRequest .

  2. NodeJS-это не браузерная среда JavaScript. Вы не можете использовать большинство функций NodeJS в среде браузера, потому что они не предназначены для этого.

    Вместо этого у вас будет локальный процесс NodeJS, предоставляющий веб-конечную точку (например, веб-сервер; возможно, используя Express, но вам это не нужно) и запустите этот процесс NodeJS, чтобы он прослушивал веб-запросы. Тогда у вас будет кнопка на вашей веб-странице, которая делает вызов ajax к серверу NodeJS, который выполняет работу.

    Естественно, это позволит выполнять работу только на машине, на которой выполняется серверный процесс.

  3. Возможно импортировать модуль serialport из https://wzrd.in/standalone/serialport@latest

    С другой стороны, попробуйте отделить логику от представления, я не знаю, будет ли ваше приложение расти или это просто POC, но используйте messageBroker или сокеты для привязки вашего представления действий с двигателем ?

    Надеюсь, это поможет