Intento incluir esta compilación, en mi navegador JS con Node.js, aquí está mi código de servidor:

var fs = require("fs");
var http = require("http");
var url = require("url");

http.createServer(function (request, response) {

    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    response.writeHead(200);

    if(pathname == "/") {
        html = fs.readFileSync("views/index.html", "utf8");
        response.write(html);
    } else if (pathname == "/ethereumjs-all.js") {
    script = fs.readFileSync("views/ethereumjs-all.js", "utf8");
        response.write(script);
    } 
    response.end();
}).listen(8000);

console.log("Listening to server on 8000...");

Y aquí está el contenido de index.html:

<html>
  <head>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script src="/ethereumjs-all.js"></script>
    <script>
    $(document).ready(function() { 
    var tx = new Transaction()
    ...
    }); // document.ready
    </script>
  </head>
  <body></body>
</html>

Sin embargo, en la consola del navegador, aparece el error ReferenceError: Transaction is not defined La biblioteca debería tener la clase Transaction definida. Entonces, ¿estoy usando browserify incorrectamente?

Gracias por cualquier ayuda!

0
jeff 14 dic. 2016 a las 00:38
¿Dónde se define el constructor Transaction?
 – 
David Gomez
14 dic. 2016 a las 00:41
En realidad, no estoy seguro, pero el código estaba funcionando en el lado del servidor. Ahora revisé ethereumjs-tx.js, la línea 8389 se parece al constructor, pero de nuevo, no soy muy fluido en JS, así que no estoy seguro de si esto es lo que nosotros necesitamos.
 – 
jeff
14 dic. 2016 a las 01:05

1 respuesta

La mejor respuesta

De su pregunta, parece que no está utilizando Browserify directamente; más bien, está utilizando un paquete UMD que se ha creado con Browserify.

Cuando se incluye un paquete UMD en un elemento script, su módulo se expone a través de un global, una propiedad agregada a window. En este caso, la propiedad / global se llama EthJS. Si lo registra con console.log(EthJS), debería ver esto:

Object
  ABI:()
  Account: function (data)
  BN: function BN(number, base, endian)
  Block: function (data)
  Buffer: function Object
  ICAP: function Object
  RLP: function Object
  Trie: function CheckpointTrie()
  Tx: function (data)
  Units: Object
  Util: Object
  VM: function VM(trie, blockchain, opts)
  Wallet: function (priv, pub)
  WalletHD: function EthereumHDKey()
  WalletThirdparty: Object

Lo que sugiere que el constructor de la transacción se llama Tx, por lo que su código probablemente debería ser:

<script>
$(document).ready(function() { 
    var tx = new EthJS.Tx(...);
    ...
}); // document.ready
</script>
1
cartant 14 dic. 2016 a las 15:55
¡Muchas gracias! Parece estar funcionando. Pero todavía no estoy seguro de cuál es la diferencia entre usar browserify directamente y lo que estoy haciendo. ¿Existe una forma alternativa de hacer esto? ¡Gracias de nuevo!
 – 
jeff
14 dic. 2016 a las 17:38
1
Realmente no estás usando Browserify en absoluto. Browserify combina módulos CommonJS en un solo paquete. Está utilizando el paquete ethereumjs-all.js prediseñado; no estás construyendo el tuyo propio. A menos que desee escribir su código utilizando módulos CommonJS y crear su propio paquete, no necesita preocuparse por Browserify. Por el momento, es posible que desee seguir con los elementos <script> y buscar en Browserify (u otro paquete, como WebPack) cuando su base de código sea más grande.
 – 
cartant
14 dic. 2016 a las 22:29