如何在Express.js中传递参数?对接Bitcoin-Core遇请求阻塞
解决Express.js调用Bitcoin Core sendtoaddress接口阻塞无响应的问题
你的sendtoaddress接口请求阻塞的核心原因是JSON-RPC参数格式错误,且缺少错误处理逻辑,导致请求一直处于挂起状态。
问题分析
- JSON格式错误:拼接
dataString时,地址参数${req.params.addr}是字符串类型,但未添加双引号,生成的JSON不符合规范。Bitcoin Core无法解析这个错误请求,因此不会返回响应,Express请求也就一直阻塞。 - 缺少错误处理:原代码仅处理了成功的情况,若请求出错(网络问题、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
相关产品推荐
相关产品推荐

