我正在尝试将 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);
})()