Soy nuevo en nodejs y quiero escribir en un puerto serie usando node pero ahora quiero que se active con un botón. Y los datos provienen de un cuadro de texto. Mi script de nodo funciona bien cuando lo ejecuto en la consola / terminal. Pero no puedo hacerlo con un botón en una página web. Aquí está mi nodejs incrustado en 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>

Aquí está el error que recibí cuando abro la consola de la página (F12)

ReferenceError: require is not defined

Gracias de antemano por tu ayuda. :)

0
Blank 14 ene. 2017 a las 11:04

3 respuestas

La mejor respuesta

Node.js es un entorno de alojamiento, que puede ejecutar JS y proporciona API específica de Node.js. Browser, es un entorno de alojamiento diferente, con diferentes API. No puede usar la API específica de Node en un navegador, y JS que usa Node API dará como resultado un error en un navegador.

Por ejemplo, su script está utilizando la función global require, que no está disponible en las API de un navegador. Y es por eso:

ReferenceError: require no está definido

Por el contrario, su script no se puede ejecutar también en Node, ya que utiliza la API del navegador:

document.getElementById ("textbox1")

Has mezclado API de diferentes entornos en un solo script.

Sin embargo, si su script JS no usa Node o API específica del navegador, puede ejecutarse tanto en Node como en un navegador sin errores. Pero no es el caso con su guión.

La solución a su problema puede ser dividir su script en dos scripts separados, ejecutar uno en un navegador y el otro en Node.js, e intercambiar datos entre ellos usando XMLHttpRequest.

1
Maxim Koretskyi 14 ene. 2017 a las 08:15

Tal vez importe el módulo de puerto serie desde https://wzrd.in/standalone/serialport@latest

Por otro lado, intente separar la lógica de la vista, no sé si su aplicación crecerá o si es solo un POC, pero use un MessageBroker o sockets para vincular la vista de sus acciones con el motor.

Espero que ayude

-1
Mech45 14 ene. 2017 a las 08:16

NodeJS es un entorno JavaScript sin navegador. No puede usar la mayoría de las funciones de NodeJS en un entorno de navegador, porque no están diseñadas para ello.

En cambio, tendría un proceso NodeJS local que proporciona un punto final web (por ejemplo, un servidor web; tal vez usando Express, pero no tiene que hacerlo) y ejecute ese proceso NodeJS para que escuche las solicitudes web. Entonces tendría un botón en su página web que realiza una llamada ajax al servidor NodeJS, que realiza el trabajo.

Naturalmente, esto solo le permitiría realizar el trabajo en la máquina donde se ejecuta el proceso del servidor.

1
T.J. Crowder 14 ene. 2017 a las 08:09