如何将Binance API获取的BTC成交量正确写入MongoDB?
解决Binance API数据写入MongoDB的变量引用问题
首先,你的核心问题是变量作用域不匹配:你在onload回调里定义的btcdata只在那个函数内部有效,而saveToDatabase函数接收的参数是BTC,所以你在函数里应该用这个参数,而不是btcdata(它不在这个函数的作用域范围内)。
具体修正步骤:
修正数据库写入的对象赋值
把原来写死的Volume字段改成用函数接收的参数,同时建议把API返回的字符串类型volume转为数值类型,方便后续数据库的数值查询和计算:const myobj = { Name: 'BTC', Volume: Number(BTC) };确认参数传递逻辑正确
你在onload里调用saveToDatabase(btcdata)的逻辑是对的,只要保证函数内部使用接收的BTC参数即可,不用再尝试访问外部的btcdata变量。
完整修正后的代码:
var requestPromise = require('request-promise'); const { MongoClient } = require('mongodb'); const schedule = require('node-schedule'); var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; var j = schedule.scheduleJob('* * * * * *', function() { var burl = "https://api.binance.com/api/v3/ticker/24hr?symbol=BTCUSDT"; var ourRequest = new XMLHttpRequest(); ourRequest.open('GET', burl, true); ourRequest.onload = function() { var x1 = JSON.parse(ourRequest.responseText) var btcdata = x1.volume; // 去掉多余括号,代码更简洁 console.log(btcdata); saveToDatabase(btcdata); } ourRequest.send(); }); const saveToDatabase = function(BTC) { const url = 'mongodb+srv://Hexynator:test123@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority'; MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => { if (err) throw err; const dbo = db.db('Crypto'); // 使用传入的BTC参数,转为数值类型存入数据库 const myobj = { Name: 'BTC', Volume: Number(BTC) }; dbo.collection('Crypto-Values').insertOne(myobj, (error, res) => { if (error) throw error; console.log(`1 document inserted with volume: ${BTC}`); db.close(); }); }); };
额外优化建议(可选):
你已经引入了request-promise,可以替换掉XMLHttpRequest,让代码更贴合Node.js异步编程风格,同时避免回调嵌套:
var j = schedule.scheduleJob('* * * * * *', async function() { try { // 直接用request-promise请求并解析JSON const x1 = await requestPromise("https://api.binance.com/api/v3/ticker/24hr?symbol=BTCUSDT", { json: true }); const btcdata = x1.volume; console.log(btcdata); await saveToDatabase(btcdata); } catch (err) { console.error('数据获取或存储失败:', err); } });
同时可以把saveToDatabase改成异步函数,用async/await处理MongoDB连接,让代码可读性更强。
内容的提问来源于stack exchange,提问作者Hexycode
相关产品推荐
相关产品推荐

