В nodeJS при импорте модулей пишет is not a constructor

Поддержка
  • До этого всё нормально работало с этим кодом

    const Web3 = require('web3');
    const address = "0x57Ad68486060A8B2d2f00042b664D80fbD036830";
    
    await (new Promise((resolve, reject) => {
    
        let web3 = new Web3('https://rpc.ankr.com/arbitrum') // тут просто меняешь RPC нужной сети
    
        web3.eth.getBalance(address, (error, balance) => {
            if (error) {
                console.error(error);
            } else {
                console.log(`Arbitrum balance: ${web3.utils.fromWei(balance, 'ether')}`); // это можно убрать, тут просто идёт ответ в лог
                [[ARBITRUM_BALANCE]] = Number(web3.utils.fromWei(balance, 'ether')) // Тут он записывает баланс в переменную баса ANSWER
            }
            resolve()
        });
    }));
    

    но теперь выдаёт 0d35dbcd-bc35-42c4-9817-39ec2d373342-image.png
    в чём причина?

  • Попробуйте

    const { Web3 } = require('web3');

  • Аналогичная проблема, метод выше к сожалению не помог. Через vs все работает, в басе ни в какую

  • @UserTrue вообще, если запросить версию этого модуля, то теперь всё нормально выводится, но скрипт, который я указал выше - не работает. Пишет "Node process stopped.". Как я понял, таким способом (const { Web3 } = require('web3');) я импортирую только часть модуля, и, когда я пытаюсь вызвать web3.eth.getBalance, то он просто не видит этот метод, так как он является уже методом объекта eth. Можно ли как-то иначе попробовать это пофиксить?

  • @nicros я не работаю с ним, откройте исходник библиотеки и посмотрите что и как там

  • Есть подозрение, что в случае использования кода в BAS в кубике Node.js, криво отрабатывают внутренние импорты.
    Можно попробовать написать отдельно скрипт и накрыть его webpack, чтобы webpack собрал все импорты в один файлик.

  • @nicros всё в БАС нормально импортируется и работает, и почему поломалось тоже можно объяснить.

    При добавлении зависимостей в БАС не просто так есть поле, где можно указать конкретную версию пакета, но по умолчанию там стоит *. Это значит, что при любом обновлении зависимости, когда вы перезапустите скрипт, установится самая ПОСЛЕДНЯЯ версия. В данном конкретном случае обновились импорты, а Node process stopped вызывается потому, что ошибки самой библиотеки некорректно обрабатываются, точнее не обрабатываются вообще. Там есть Promise API, поэтому рекомендую использовать его:

    const { Web3 } = require('web3');
    const address = "0x57Ad68486060A8B2d2f00042b664D80fbD036830";
    
    await(new Promise((resolve, reject) => {
        let web3 = new Web3('https://rpc.ankr.com/arbitrum');
    
        web3.eth.getBalance(address).then((balance) => {
            console.log(`Arbitrum balance: ${web3.utils.fromWei(balance, 'ether')}`);
            [[ARBITRUM_BALANCE]] = Number(web3.utils.fromWei(balance, 'ether'));
            resolve()
        }).catch(reject);
    }));
    

    Чтобы понять, что именно за ошибка привела к остановке процесса, используем такой подход.
    Чтобы такого больше не происходило, всегда указывайте конкретную версию зависимостей для ноды!