TypeError: app.getGreeting 不是一个函数



我正在尝试将 NodeJs 服务器连接到已迁移到本地区块链的 solidity 合约,然后通过 javascript 调用此类上的方法。但是,代码返回一个错误,指出未定义getGreeting()

我是Solidity和JavaScript(C和Java的背景(的新手,所以我觉得我忽略了一些非常简单的东西?

我的问题是如何让它工作并找到方法并将"Hello, World!

我的开发环境是:

  • 松露 v5.1.10(核心:5.1.10(
  • 坚固性 - 0.4.25 (solc-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);  
});

对于上下文,Solidity合约如下:

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;
}
}

对于那些将来查看此内容的人来说,问题是我根据此处的@truffle/合同文档错误地导入了提供程序。另外,忘了履行第二个承诺。因此,截至撰写本文时,此解决方案的答案如下:

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的帮助。

您是在 Promise 对象上调用函数 "getGreeting((",而不是在合约实例上。

// 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);
})()

最新更新