Интеграция web3 из Metamask в React [закрыто]

Возникли проблемы с интеграцией web3 из Metamask в React. Версия метамаски: web3@1.0.0-beta.34

import Web3 from 'web3'

let web3;

window.addEventListener('load', function () {
    if (typeof window.web3 !== 'undefined') {        
        web3 = new Web3(window.web3.currentProvider);
    } else {
        // No web 3 provider
        console.log("Please install Metamask");
    }    
});

export default web3;

Получение следующей ошибки:

window is not defined
ReferenceError: window is not defined
    at Object../lib/getWeb3.js (lib/getWeb3.js:5:0)
Эта проблема не специфична для Ethereum. Проблема в том, что windowне определено. Я подозреваю, что вы используете этот скрипт на стороне сервера. Наверное, это как-то связано. Вы, вероятно, получите лучшие ответы, если зададите свой вопрос на Stack Overflow.
@ Хенк, ты прав, ОП запускает скрипт на стороне сервера. Вот мой вопрос к вам. Какова цель web3? Разве это не позволяет нам взаимодействовать с узлами эфириума? Скорее всего, никто не использует Metamask в своем браузере, так как же мы можем создавать децентрализованные приложения для людей, которые не используют Metamask? Хм, давайте посмотрим, есть ли React, Next.js, и те инженеры, которые используют эти технологии для того, чтобы сделать децентрализованные приложения доступными для мира, не использующего Metamask, не использующего Rinkeby, будут время от времени сталкиваться с этими проблемами.

Ответы (1)

Вопрос: Ваш скрипт работает на стороне клиента или на стороне сервера? Если на стороне сервера - то вы не можете получить доступ к оконному объекту.

Если на стороне клиента - посмотрите на этот вопрос https://stackoverflow.com/questions/43220331/is-the-window-object-of-react-synthetic

Я не думаю, что это имеет значение, OP нужно было реорганизовать его условное значение на (typeof window !== 'undefined' && typeof window.web3 !== 'undefined'), тогда его первое возвращение позаботилось бы о том, чтобы быть в браузере, его else было оставлено пустым, и OP нужно было иметь дело со случаем, когда OP находится на стороне сервера примерно так: const provider = new Web3.providers.HttpProvider(). Заметили использование web3и providersповсюду? Звуки эфириума связаны со мной.