Node.js调用Solidity合约返回字符串数组为字符串该如何处理
解决方案
问题原因
出现该问题的核心原因有两个:
- 合约ABI配置错误,调用端无法识别返回值为字符串数组类型,自动转为原始字符串
- 调用代码混用
await和回调函数,导致返回值解析逻辑冲突
修复步骤
- 第一步:校验合约ABI
确保你导入到Node.js项目的合约ABI中,get方法的返回值配置如下:
{ "inputs": [], "name": "get", "outputs": [ { "internalType": "string[]", "name": "", "type": "string[]" } ], "stateMutability": "view", "type": "function" }
如果ABI中type字段写的是string而非string[],替换为最新编译生成的ABI即可。
- 第二步:修正调用代码
不要同时使用await和回调函数,二选一即可,以下是两种正确写法:
写法1:纯await异步写法
router.get('/', async function (req, res, next) { try { const result = await Contract.methods.get().call(); console.log('get result', result, Array.isArray(result)); // 正常情况此处Array.isArray会返回true res.send(result); } catch (err) { console.error('调用失败', err); res.status(500).send('调用失败'); } })
写法2:纯回调写法
router.get('/', function (req, res, next) { Contract.methods.get().call(function (err, result) { if (err) { console.error('调用失败', err); return res.status(500).send('调用失败'); } console.log('get result', result, Array.isArray(result)); res.send(result); }); })
- 第三步:兜底转换方案
如果上述操作完成后仍拿到字符串格式的返回值(如"['x','y']"),可以手动做格式转换:
// 先把单引号替换为JSON标准的双引号,再转成数组 const resultArray = JSON.parse(rawResult.replace(/'/g, '"'));
内容的提问来源于stack exchange,提问作者chaitu
相关产品推荐
相关产品推荐

