TypeError: Web3 не является конструктором при попытке использовать node.js с трюфельным контрактом

Я пытаюсь использовать node.js со своим смарт-контрактом для своего приложения. Когда я пытался перейти от использования настроек по умолчанию app.jsк index.jsнастройкам, я столкнулся с этой странной проблемой, которую не могу исправить.

Он выдает ошибку при попытке создать экземпляр моего файла .json с помощью truffle-contract.

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   

У меня было то же самое, но в моем app.js, где трюфель помещает его автоматически, и он работал нормально.

Может кто-нибудь объяснить разницу между использованием трюфельного контракта в моем app.js/client-side и в моем index.js/server-side. Спасибо за любую помощь.

Ответы (2)

Если вы работаете в браузере с MetaMask, то Web3вводится как побочный эффект (хотя старайтесь не полагаться на такое поведение). В коде на стороне сервера вы должны импортировать web3 самостоятельно, указав что-то вроде:

const Web3 = require('web3')

рядом с началом вашего кода. Вам также может понадобиться npm install web3или yarn install web3, и если вы используете BigNumber (который они больше не связывают с Web3 1.0), то вы, вероятно, захотите указать npm install web3@^0.20.6или yarn install web3@^0.20.6.

Привет, @James_pic, сейчас я делаю var Web3 = require('web3'), и это работает нормально, потому что без него сказано: «Web3 не ...". Я попытаюсь установить npm web3@0.20.6 и посмотреть, работает ли это!
К вашему сведению для более поздних читателей: автоинъекция устарела .

У меня была такая же ошибка «... Web3 не является конструктором».

Проблема была в том порядке, в котором я включил следующее в html-код:

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

Я только что убедился, что скрипт web3.min.js вызывается до трюфельного контракта, и это решило проблему.

Правильный порядок включения:

<script src="./js/web3.min.js"></script>
<script src="./js/truffle-contract.js"></script>
Спасибо за ответ d5t, потому что моя ситуация исправлена ​​тем, что предложил James_pic.
2021, и это то, что сработало для меня. Спасибо!