我在Kovan上部署了一个智能合约,它包含一个getter函数:
function getOrderStatus(uint _orderId) public view returns(bool shipped, bool arrived, bool payed) {
return (orders[_orderId].shipped, orders[_orderId].arrived, orders[_orderId].payed);
}
如果我通过web3调用该函数,我会在控制台上得到以下输出,这很好!:
Result {
'0': false,
'1': false,
'2': false,
shipped: false,
arrived: false,
payed: false }
但是,如果我试图通过callback function
转发返回的对象以提供它,例如通过API,我会在浏览器上得到以下输出:
[object Object]
唯一的区别是代替console.log(returnValue)
->callback(returnValue)
位于以下代码末尾:
function getOrderStatus(_orderId, callback) {
contractABI.methods.getOrderStatus(_orderId).call()
.then(returnValue => callback(returnValue));
}
然后通过Express
调用该函数
app.get('/api/getOrderStatus', function(req, res) {
orderId = req.query.orderId;
getOrderStatus(orderId, function(error, data) {
if (!error) {
res.send(data);
}
else
{
res.send(error);
}
});
});
如果你的getOrderStatus()
函数是这样的:
function getOrderStatus(_orderId, callback) {
contractABI.methods.getOrderStatus(_orderId).call()
.then(returnValue => callback(returnValue));
}
那么你的结果是returnValue
,对吧?如果像上面描述的那样调用callback
函数,那么第一个参数就是数据。
在您的路由中,第一个参数是error
参数,所以我想应该是这样的:
app.get('/api/getOrderStatus', function(req, res) {
orderId = req.query.orderId;
getOrderStatus(orderId, function(data, error) { // <--- changed order of parameters
if (!error) {
res.json(data);
} else {
res.send(error);
}
});
});
希望能有所帮助。。。