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

Adonis构建Bitcoin RPC系统:request.js回调无法返回端点响应

解决Adonis框架中Bitcoin RPC响应无法返回至Web端点的问题

我来帮你排查这个问题,先看看你代码里的几个核心问题:

  1. 异步操作没处理到位:request.js是基于回调的异步工具,你的控制器方法直接返回request(options, callback),但Adonis的HTTP控制器需要明确等待异步操作完成才能正确返回响应。回调里的response.send虽然执行了,但控制器函数可能已经提前走完流程,导致响应没正确发送给客户端。

  2. 变量声明有问题:const returnData;这种写法是无效的,const变量必须初始化,而且就算你改了声明方式,回调里的赋值也会有作用域问题,没法正确拿到值。

  3. 回调逻辑有漏洞:你把return response.send('data')放在回调函数的末尾,不管请求成功与否都会执行,这会导致就算成功获取到RPC数据,也会被这行代码覆盖掉正确的响应。

修复方案

推荐改用request-promise(request的Promise化版本),配合Adonis的async/await语法,这样异步流程会清晰很多:

首先安装依赖:

npm install request-promise

然后修改你的getBlockCount方法:

const rp = require('request-promise');

async getBlockCount({ response }) {
  const dataString = `{"jsonrpc":"1.0","id":"curltext","method":"getblockcount","params":[]}`;
  const options = {
    url: `http://${USER}:${PASS}@${HOST}:${PORT}/`,
    method: "POST",
    headers: headers,
    body: dataString,
    json: true // 自动解析JSON响应,不用手动写JSON.parse
  };

  try {
    const rpcResponse = await rp(options);
    console.log(rpcResponse);
    return response.status(200).send(rpcResponse);
  } catch (error) {
    console.error('RPC请求出错:', error);
    return response.status(500).send({ error: 'Failed to fetch block count' });
  }
}

为什么这样修复?

  • async/await:让异步代码看起来像同步代码,Adonis会等待await rp(options)完成后再处理响应,确保数据能正确发送到Postman。
  • request-promise:把回调式的request转换成Promise,更适合在async函数里使用,避免回调嵌套的问题。
  • json: true:自动处理JSON的序列化和反序列化,省去手动解析的步骤,减少出错概率。
  • 错误处理:用try/catch捕获RPC请求的错误,给客户端返回明确的错误响应,不会出现控制台有报错但客户端拿不到反馈的情况。

如果不想换库,用原生request.js也可以

要是你不想换依赖,也可以用Promise把回调包裹起来,让控制器等待异步操作完成:

getBlockCount({ response }) {
  const dataString = `{"jsonrpc":"1.0","id":"curltext","method":"getblockcount","params":[]}`;
  const options = {
    url: `http://${USER}:${PASS}@${HOST}:${PORT}/`,
    method: "POST",
    headers: headers,
    body: dataString
  };

  return new Promise((resolve, reject) => {
    request(options, (error, nextRes, body) => {
      if (error) {
        console.error(error);
        return reject(error);
      }
      if (nextRes.statusCode !== 200) {
        return reject(new Error(`RPC返回错误状态码: ${nextRes.statusCode}`));
      }
      const data = JSON.parse(body);
      console.log(data);
      resolve(response.status(200).send(data));
    });
  });
}

这样控制器返回一个Promise,Adonis会等Promise完成后再处理响应,客户端就能拿到正确的RPC数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:52:28