Adonis构建Bitcoin RPC系统:request.js回调无法返回端点响应
解决Adonis框架中Bitcoin RPC响应无法返回至Web端点的问题
我来帮你排查这个问题,先看看你代码里的几个核心问题:
异步操作没处理到位:
request.js是基于回调的异步工具,你的控制器方法直接返回request(options, callback),但Adonis的HTTP控制器需要明确等待异步操作完成才能正确返回响应。回调里的response.send虽然执行了,但控制器函数可能已经提前走完流程,导致响应没正确发送给客户端。变量声明有问题:
const returnData;这种写法是无效的,const变量必须初始化,而且就算你改了声明方式,回调里的赋值也会有作用域问题,没法正确拿到值。回调逻辑有漏洞:你把
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
相关产品推荐
相关产品推荐

