Die Eigenschaft „interface“ von „undefined“ oder „null“ kann nicht destrukturiert werden. Wie löst man das?

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');

const provider = ganache.provider();
const web3 = new Web3(provider);

const { interface, bytecode } = require('../compile');

let accounts;
let inbox;

beforeEach(async () => {
  // Get a list of all accounts
  accounts = await web3.eth.getAccounts();
  // Use one of those accounts to deploy the contract
  inbox = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({ data: bytecode, arguments: ['Hi there!'] })
    .send({ from: accounts[0], gas: '1000000' });


  inbox.setProvider(provider);
});

describe('inbox', () => {
  it('deploys a contract', () => {
    assert.ok(inbox.options.address);
  });
  it('has a default message', async () => {
    const message = await inbox.methods.message().call();
    assert.equal(message, 'Hi there!');
  });
});

FEHLER

sollte nicht beforeEachdrin sein describe?
Nein, wenn wir dies tun, müssen wir es in der gesamten Beschreibung bereitstellen (lokales, globales Konzept).
scheint ein Problem mit Ihrer Kompilierungsdatei zu sein. require('../compile') gibt anscheinend null oder undefiniert zurück.

Antworten (8)

Der Fehler liegt sicher bei dem require('../compile'), da es eine Null zurückgeben muss.

Versuchen Sie, sich auf den folgenden Code zu beziehen, um den Solidity-Code zu kompilieren. Überprüfen Sie, ob Ihre Datei compile.js auf ähnliche Weise funktioniert oder nicht.

// Compile the source code
const input = fs.readFileSync('Coin.sol');

const output = solc.compile(input.toString(), 1);

const bytecode = output.contracts[':Coin'].bytecode;

const abi = JSON.parse(output.contracts[':Coin'].interface);

Stellen Sie sicher, dass Sie das 'C' von 'Coin.sol' in Großbuchstaben in 'compile.js' haben const abi = JSON.parse(output.contracts[':Coin'].bytecode); , denn so wird es in Solidität gespeichert

Wie hast du es geschafft? @shashvat
@urjitonrails überprüfen Sie einfach Ihre compile.js-Datei. Stellen Sie sicher, dass Sie den ersten Buchstaben in Großbuchstaben geschrieben haben, wie im obigen Code gezeigt.

Das Problem liegt nicht am bereitgestellten Code. Irgendetwas stimmt mit Ihrer "compile"-Datei nicht.

const { interface, bytecode } = require('../compile');

ist das Problem,

require('../compile')

kehrt zurück undefinedoder null.

Ja, also wie soll ich das beheben? I Bytecode funktioniert. Bei der Schnittstelle bin ich mir nicht sicher. Können Sie mir bitte weiterhelfen?
Vielleicht posten Sie eine andere Frage mit Ihrer Kompilierungsdatei, wenn Sie es nicht herausfinden können. Der Bytecode funktioniert auch nicht. Das Ganze require('../compile')wird zu undefinedoder ausgewertet null. Das ist alles, was ich aus dem entnehmen kann, was du gepostet hast.
Beachten Sie auch, dass der von Ihnen gepostete Fehler nichts mit Ethereum zu tun hat, es ist nur ein Javascript-Fehler.

Sie müssen sicherstellen, dass Sie alles korrekt aus Ihrer compile.jsDatei in Ihre Testdatei exportieren. Ich habe einen Rechtschreibfehler, als ich den Vertrag exportierte, mein Code-Bit hier module.exports = solc.compile(source, 1).contracts[':Registration'];war die Registrierung :registrationanstelle von :Registrationund daher die {interface, bytecode } were not being exported from thecompile.js`.

Ich hoffe das hilft. Es war ein Tippfehler, js error.

Da ich Ngambinos Beitrag nicht kommentieren kann. Das hat bei mir auch hier 2021 funktioniert.

(Danke an) ngambino0192:

Das Problem dabei ist wahrscheinlich die Versionierung des Solc-Compilers. Wenn Sie die Abhängigkeit der Version auf eine neuere Version umstellen, kann Ihr Problem möglicherweise gelöst werden.

Versuche Folgendes:

  1. rm -rf node_modules// entfernennode_modules
  2. rm -rf package-lock.json// entfernenpackage-lock.json
  3. Ändern Sie die Importanweisung der .sol-Datei wie folgt:pragma solidity ^0.4.25
  4. Ändern Sie die Importanweisung der .sol-Datei wie folgt:pragma solidity ^0.4.25
  5. Ändern Sie die Abhängigkeit in package.json in"solc": "^0.4.25"
  6. npm install // neue Abhängigkeiten installieren
  7. Dann können Sie Ihre Tests durchführen

Das Problem liegt nicht in der js-Datei, sondern in der .sol- Datei

  1. Stellen Sie sicher, dass Sie die Solidity- und Solc-Version 0.4.17 verwenden

  2. Stellen Sie sicher, dass Sie keine Funktionen der neuen Solidity-Version in Ihrer alten Version wie Konstruktor verwenden

  3. Es kann sich um einen grundlegenden Syntaxfehler in Ihrer compile.js-Datei oder .sol-Datei handeln

Ich habe auch den gleichen Fehler erhalten, aber stellen Sie sicher, dass Ihr Vertragsname und der Name, den Sie hier verwenden, richtig geschrieben sind: module.exports = solc.compile(source, 1).contracts[': Lottery ']; und Vertragslotterie { Diese muss identisch sein.

Für Googler:

Das Problem dabei ist wahrscheinlich die Versionierung des Solc-Compilers. Wenn Sie die Abhängigkeit der Version auf eine neuere Version umstellen, kann Ihr Problem möglicherweise gelöst werden.

Versuche Folgendes:

  1. rm -rf node_modules// entfernennode_modules
  2. rm -rf package-lock.json// entfernenpackage-lock.json
  3. Ändern Sie die Importanweisung der .sol-Datei wie folgt:pragma solidity ^0.4.25
  4. Ändern Sie die Abhängigkeit in package.json in"solc": "^0.4.25"
  5. npm install// neue Abhängigkeiten installieren

Dann können Sie Ihre Tests durchführen

In meinem Fall habe ich verwendet

pragma solidity ^0.4.17;

Und

constructor() public {...}

statt Funktion

Lottery() public{...}

Die Verwendung von Solc-Version 0.4.25 und Konstruktor() wird unterstützt. Andernfalls wird ein Fehler ausgegeben wie „RangeError: Maximale Aufruflistengröße überschritten“ und „Eigenschaft „Schnittstelle“ von „require(...)“ kann nicht destrukturiert werden, da sie nicht definiert ist“.

Ich habe diesen obigen Fehler erhalten, als ich den Mokka-Test für meinen Vertrag ausgeführt habe.

Löschen Sie node_module, package.lock.json und aktualisieren Sie die Solc-Version im Vertrag sowie in der package.json und installieren Sie sie erneut mit dem Befehl „npm install“.