You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js调用Solidity合约返回字符串数组为字符串该如何处理

解决方案

问题原因

出现该问题的核心原因有两个:

  1. 合约ABI配置错误,调用端无法识别返回值为字符串数组类型,自动转为原始字符串
  2. 调用代码混用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:45:05