从UI向Solidity智能合约传递字符串时触发Error: invalid string value错误的排查与解决请求
解决Solidity合约字符串参数传递的Invalid String Value错误
你遇到的Error: invalid string value (arg="_name", coderType="string", value=null)错误,核心原因是UI代码里错误地把字符串类型的输入值强制转换成了整数,而你的Solidity合约setData方法要求的是string类型参数,类型不匹配直接导致了这个报错。
问题代码分析
看你提交按钮的点击事件处理逻辑:
var name = 0; name = parseInt($('#name').val()); var birthday = 0; birthday = parseInt($('#birthday').val());
- 姓名是纯字符串内容,用
parseInt转换后,非数字输入会变成NaN,空输入则会变成null,完全不符合合约需要的字符串类型 - 生日输入的是
YYYY-MM-DD格式的字符串,parseInt只能提取开头的年份数字,最终得到的是整数,同样不满足合约的string参数要求
修复方案
只需要去掉多余的parseInt转换,直接获取输入框的字符串值即可,Web3.js v1.x版本会自动处理字符串参数的编码和传递,不需要额外的字符串解析代码。修改后的点击事件代码如下:
$('#submit').click(function() { // 直接获取输入的字符串值,trim去掉首尾空格 var name = $('#name').val().trim(); var birthday = $('#birthday').val().trim(); // 先做基础输入校验,避免空值提交浪费Gas if (!name || !birthday) { alert("请填写完整的姓名和生日信息"); return; } web3.eth.getAccounts().then(function(accounts){ var acc = accounts[0]; // 直接传递字符串参数给合约方法 return contract.methods.setData(name, birthday).send({from: acc}); }).then(function(tx) { console.log("交易执行成功:", tx); // 可选:提交成功后清空输入框 $('#name').val(''); $('#birthday').val(''); }).catch(function(error) { console.error("交易执行失败:", error); }) });
后续扩展提示
如果之后你要完善合约,把playerAddress和playerNationality的赋值逻辑放开(取消合约里的注释),只需要在UI里添加对应的参数获取即可,比如:
var address = $('#address').val().trim(); var nationality = $('#nationality').val().trim(); // 然后调用contract.methods.setData(name, birthday, address, nationality).send(...)
完全不需要额外的字符串处理逻辑,Web3.js会自动完成参数的编码工作。
内容的提问来源于stack exchange,提问作者tombodders
相关产品推荐
相关产品推荐

