Truffle Exec se atasca [cerrado]

Quiero ejecutar un script en la consola de truffle.

guion

const artifacts = require('./build/contracts/Message.json')

const contract = require('truffle-contract')
const Message = contract(artifacts);
Message.setProvider(web3.currentProvider);


module.exports = ()=> {
  creator = web3.eth.accounts[0];
  purchaser = web3.eth.accounts[1];
  web3.personal.unlockAccount(creator);
  var messageInstance = null;
  Message.deployed().then(inst => { return messageInstance = inst}).then( () =>{ console.log("Creating Message"); return messageInstance.createMessage(creator, "message.newMessage") }).catch((error)=> { console.error("error", error) }).then( ()=> { return console.log("End");} )
}

A mano

Cuando inserto manualmente el script (solo la parte dentro de module.exports), funciona línea por línea y obtengo el último archivo console.log.

con ejecutivo

Cuando ejecuto exec ./run.js: el script se atasca en la segunda Promesa sin ningún error.

¿Funciona bien si lo configuras web3.eth.defaultAccount = web3.eth.accounts[0]de truffle developantemano?
Esto no es un problema de ethereum. Es que javascript se usa incorrectamente. Usted asigna una función a module.exports, y debe usarse cuando desee que una función se use desde otro archivo. Si solo desea ejecutar el cuerpo de la función, entonces no necesita una función ni asignarla module.exports, escriba la instrucción directamente en su archivo.
@ Ismael, module.exportsestá bien: truffleframework.com/docs/truffle/getting-started/…
@PaulRBerg configurar y desbloquear una cuenta (de antemano y en el script) no ayuda. Aunque no se que cambio pero me da Error: invalid addresserror al llamar a la cadena de promesas con exec. Que suele ser el error por no tener una cuenta predeterminada. I console.logla cuenta predeterminada y muestra la correcta en ambas soluciones (antes y en el script).
Lo descubrí @PaulRBerg thx por darme la dirección correcta.

Respuestas (1)

Esta solución funcionó:

const messageBuild = require('./build/contracts/Message.json')
const contract = require('truffle-contract')
const Message = contract(messageBuild);

module.exports = (callback)=> {
  Message.setProvider(web3.currentProvider);

  var creator = web3.eth.accounts[0]
  var purchaser = web3.eth.accounts[1]

  web3.eth.defaultAccount = creator
  web3.personal.unlockAccount(creator);

  Message.defaults({from: creator})

  var messageInstance = null
  Message.deployed().then(inst => { return messageInstance = inst}).then( () =>{ console.log("Creating Message:", typeof messageInstance.createMessage, "creator", creator, "web3.eth.defaultAccount", web3.eth.defaultAccount); return messageInstance.createMessage(creator, "This is a classic warning") }).catch((error)=> { console.error("\n\n\n\n==>error", error) }).then( () =>{ console.log("Reading Message", typeof messageInstance.readMessage); return messageInstance.readMessage(creator).then((msg) => console.log("The result is:", msg)) }).then( ()=> { return console.log("End"); return callback()} )
}

Creo que fue el faltante de:

Message.defaults({from: creator})

Trufa dirección inválida

Para otros: la solución no es el "desde" que falta, sino la adición de un parámetro de devolución de llamada y, de hecho, llamarlo. Use esto como su plantilla de función: ``` module.exports = async function(callback) { return callback() };```
Si no devuelves la llamada, la ejecución nunca continúa, ¡así que aprendes!