Las solicitudes síncronas no son compatibles con el proveedor de IPC

Estaba tratando de conectarme a mi nodo a través de IPC usando web3_ipc. Pero me golpeó:

 You tried to send "eth_getBalance" synchronously. Synchronous requests are not supported by the IPC provider.

Mi código es como:

var web3_extended = require('web3_ipc');
var path = require('path');
var absolutePath =  path.relative('./','/home/pr.singh/.ethereum/geth.ipc');
var options = {
  host : absolutePath,
  // host: 'http://10.10.23.139:8013',
  ipc : true,
  personal: true, 
  admin: true,
  debug: false
};

var web3 = web3_extended.create(options);

exports.checkBalance = function(req, res) {
    var bal = req.body.balance;
                var accountBalance=web3.eth.getBalance(bal).toNumber(); 
                console.log(accountBalance);
}

Si me conecto usando rpc, todo funciona bien pero mientras me conecto a través de IPC, recibo un error. ¿Alguna ayuda?

Respuestas (1)

Parece que IPC no admite llamadas sincrónicas, lo que tiene sentido en términos de ejecución de código sin bloqueo en este tipo de arquitectura. Metamask tiene la misma restricción.

De todos modos, en mi opinión, una buena práctica es usar una llamada asincrónica con el método de devolución de llamada: puede pasar directamente la función de devolución de llamada en la llamada Web3:

exports.checkBalance = function(req, res) {
    var bal = req.body.balance;

    web3.eth.getBalance(bal, function(error, result) {
        // This is executed once I got the response
        console.log("Response received");

        if(error != null) {
            console.error(error);
            return;
        }

        var accountBalance = result.toNumber();
        console.log(accountBalance);
    }); 

    // This is executed just after the request is sent no matter the response
    console.log("Request sent");
}

O para una mejor reutilización, defina su función de devolución de llamada e inyéctela como un parámetro:

exports.checkBalance = function(req, res) {
    var bal = req.body.balance;

    web3.eth.getBalance(bal, exports.checkBalanceCallback); 
}

exports.checkBalanceCallback = function(error, result) {

     if(error != null) {
        console.error(error);
         return;
     }

    var accountBalance = result.toNumber();
    console.log(accountBalance);
}

EDITAR: Acabo de editar mi respuesta, de acuerdo con la documentación de Web3 sobre la devolución de llamada , la firma del método es función (error, resultado);

Después de implementar este estilo de método, obtengo un resultvalor nulo y , por result.toNumber()lo tanto, estoy dando un error.
Acabo de editar mi respuesta, de acuerdo con la documentación de Web3 sobre la devolución de llamada, la firma del método es función (error, resultado);