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

如何在Express.js中传递参数?对接Bitcoin-Core遇请求阻塞

解决Express.js调用Bitcoin Core sendtoaddress接口阻塞无响应的问题

你的sendtoaddress接口请求阻塞的核心原因是JSON-RPC参数格式错误,且缺少错误处理逻辑,导致请求一直处于挂起状态。

问题分析

  1. JSON格式错误:拼接dataString时,地址参数${req.params.addr}是字符串类型,但未添加双引号,生成的JSON不符合规范。Bitcoin Core无法解析这个错误请求,因此不会返回响应,Express请求也就一直阻塞。
  2. 缺少错误处理:原代码仅处理了成功的情况,若请求出错(网络问题、Bitcoin Core返回错误等),没有返回任何响应,导致请求挂起。

修正方案

1. 修正GET接口(保留原路径传参方式)

router.get("/sendtoaddress/:addr/:amount", (req, res) => {
  // 给地址参数添加双引号,确保JSON格式合法
  const dataString = `{"jsonrpc": "1.0", "id": "curltext", "method": "sendtoaddress", "params": ["${req.params.addr}", ${req.params.amount}]}`;
  console.log(req.params.addr);
  
  const options = {
    url: `http://${USER}:${PASS}@127.0.0.1:18443/`,
    method: "POST",
    headers: headers,
    body: dataString
  };

  const callback = (error, response, body) => {
    // 处理网络或请求错误
    if (error) {
      return res.status(500).json({ error: error.message });
    }
    // 处理非200状态码的响应
    if (response.statusCode !== 200) {
      return res.status(response.statusCode).json({ error: "Bitcoin Core请求失败", response_body: body });
    }
    try {
      const data = JSON.parse(body);
      // 处理Bitcoin Core返回的JSON-RPC错误
      if (data.error) {
        return res.status(400).json(data.error);
      }
      res.send(data);
    } catch (parseErr) {
      res.status(500).json({ error: "解析响应失败", details: parseErr.message });
    }
  };

  request(options, callback);
});

2. 推荐:改用POST接口(更符合REST规范)

转账属于有副作用的操作,不适合用GET请求。建议将参数放在请求体中,更安全规范:

router.post("/sendtoaddress", (req, res) => {
  const { addr, amount } = req.body;
  // 先校验必填参数
  if (!addr || !amount) {
    return res.status(400).json({ error: "缺少addr或amount参数" });
  }

  const dataString = `{"jsonrpc": "1.0", "id": "curltext", "method": "sendtoaddress", "params": ["${addr}", ${amount}]}`;
  
  const options = {
    url: `http://${USER}:${PASS}@127.0.0.1:18443/`,
    method: "POST",
    headers: headers,
    body: dataString
  };

  const callback = (error, response, body) => {
    if (error) {
      return res.status(500).json({ error: error.message });
    }
    if (response.statusCode !== 200) {
      return res.status(response.statusCode).json({ error: "Bitcoin Core请求失败", response_body: body });
    }
    try {
      const data = JSON.parse(body);
      if (data.error) {
        return res.status(400).json(data.error);
      }
      res.send(data);
    } catch (parseErr) {
      res.status(500).json({ error: "解析响应失败", details: parseErr.message });
    }
  };

  request(options, callback);
});

关键修复点

  • 给地址参数添加双引号,确保JSON格式正确,让Bitcoin Core能正常解析请求。
  • 完善错误处理逻辑,覆盖网络错误、非200状态码、JSON解析错误、Bitcoin Core返回的业务错误,确保任何情况下都能返回响应,避免请求阻塞。

内容的提问来源于stack exchange,提问作者bobor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:05:48