TypeError: Web3 ist kein Konstruktor, wenn versucht wird, node.js mit Truffle-Contract zu verwenden

Ich versuche, node.js mit meinem Smart Contract für meine App zu verwenden. Als ich versucht habe, von der Verwendung des Standard app.js-Setups zum index.jsSetup zu wechseln, bin ich auf dieses seltsame Problem gestoßen, das ich nicht beheben kann.

Es löst den Fehler aus, wenn ich versuche, meine .json-Datei mit Truffle-Contract zu instanziieren.

App.contracts.Flip = TruffleContract(FlipArtifact); //at this line it goes to truffle-contract.js and throws this error: 

var BigNumber = (new Web3()).toBigNumber(0).constructor;

TypeError: Web3 is not a constructor   

Ich hatte genau dasselbe, aber in meiner app.js, wo truffle es automatisch ablegt und es funktionierte gut.

Könnte jemand bitte den Unterschied zwischen der Verwendung von Truffle-Contract in meiner app.js/client-side und meiner index.js/server-side erklären. Danke für jede Hilfe.

Antworten (2)

Wenn Sie in einem Browser mit MetaMask laufen, Web3wird dies als Nebeneffekt injiziert (obwohl Sie sich nicht auf dieses Verhalten verlassen sollten). Im serverseitigen Code müssen Sie web3 selbst importieren, indem Sie Folgendes einfügen:

const Web3 = require('web3')

am Anfang Ihres Codes. Möglicherweise müssen Sie auch npm install web3oder yarn install web3angeben, und wenn Sie BigNumber verwenden (das nicht mehr mit Web3 1.0 gebündelt wird), möchten Sie wahrscheinlich npm install web3@^0.20.6oder angeben yarn install web3@^0.20.6.

Hey @James_pic, ich mache gerade var Web3 = require('web3') und das funktioniert gut, weil ohne "Web3 not a ..." gesagt wird. Ich werde versuchen, web3@0.20.6 mit npm zu installieren und sehen, ob das funktioniert!
FYI für spätere Leser: Autoinjektion ist veraltet .

Ich hatte den gleichen Fehler "...Web3 ist kein Konstruktor".

Das Problem war in der Reihenfolge, in der ich Folgendes in den HTML-Code aufgenommen hatte:

<script src="./js/truffle-contract.js"></script>
<script src="./js/web3.min.js"></script>

Ich habe nur sichergestellt, dass das web3.min.js-Skript vor dem Truffle-Contract aufgerufen wurde, und das hat das Problem gelöst.

Richtige Reihenfolge zum Einschließen:

<script src="./js/web3.min.js"></script>
<script src="./js/truffle-contract.js"></script>
Vielen Dank für die Antwort d5t, für meine Situation, die das von James_pic vorgeschlagene Problem behoben hat.
2021 und das hat bei mir funktioniert. Danke!