TypeError: app.getGreeting не является функцией - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь подключить сервер NodeJs к контракту на надежность, который был перенесен в локальную цепочку блоков, а затем вызвать методы этого класса через javascript. Тем не менее, код возвращает ошибку, в которой говорится, что getGreeting() не определено.

Я очень новый Solidity и JavaScript (фон в C и Java), поэтому я чувствую, что я упустить что-то действительно простое?

Мой вопрос: как заставить его работать, найти метод и вернуть «Hello, World!» к терминалу?

Моя среда разработки:

  • Трюфель v5.1.10 (ядро: 5.1.10)
  • Солидность - 0,4.25 (соль c - js)
  • Узел v12.14.1
  • Web3. js v1.2.1

Ниже приведен код, над которым я работаю:

// import our compiled JSON
const contractJSON = require("./build/contracts/Hello.json");
const contract = require("@truffle/contract");
const Web3 = require('web3');

// create instance of ganache-cli provider
const web3 = new Web3("http://localhost:9545");

var Hello = contract(contractJSON);

Hello.setProvider(web3);

// if contract is deployed return instance of it and store in app variable
let app = Hello.deployed().then((instance) =>{
    return instance;

}).catch(function(error) {
    return error;
});

// call a method on our contract via javascript 
app.getGreeting().then(() => {
    console.log(app);  
});

Для контекста контракт Солидности выглядит следующим образом:

pragma solidity >=0.4.0 <0.7.0;

contract Hello {

    string greeting;

    constructor() public {
        greeting = "Hello, World!";
    }

    function getGreeting() public view returns (string memory) {
        return greeting;
    }

    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
    }
}

Ответы [ 2 ]

1 голос
/ 28 января 2020

Для тех из вас, кто просматривает это в будущем, проблема заключалась в том, что я неправильно импортировал провайдера в соответствии с документацией @ truffle / contract здесь . Также забыл выполнить второе обещание. Поэтому ответ на это решение на момент написания статьи был следующим:

const provider = new Web3.providers.HttpProvider("http://localhost:9545");

let Hello = contract(contractJSON);
Hello.setProvider(provider);

Hello.deployed().then((instance) => {
    deployed = instance;
    return instance.getGreeting();
}).then((result) => {
    console.log(result);
}).catch((error) => {
    console.log(error);
});

Большое спасибо @blex за помощь.

0 голосов
/ 28 января 2020

Вы вызываете функцию "getGreeting ()" для объекта Promise, а не для экземпляра контракта.

// import our compiled JSON
const contractJSON = require("./build/contracts/Hello.json");
const contract = require("@truffle/contract");
const Web3 = require('web3');

// create instance of ganache-cli provider
const web3 = new Web3("http://localhost:9545");

var Hello = contract(contractJSON);

Hello.setProvider(web3);

(async () => {
    // Get Contract Instance
    let app = await Hello.deployed();
    // Call Function
    const response = await app.getGreeting();
    console.log(response);
})()
...