Добрый день, у меня есть скрипт, который каждые 30 минут получает данные от Binance API и сохраняет их в базе данных MongoDB c в разных коллекциях. Мой MongoDB установлен на VPS. Я подключаюсь к нему со своего локального компьютера.
Проблема в том, что я оставляю свой код работать постоянно в течение ± 3 дней и получаю, что иногда данные не сохраняются при определенной c сборе или пропущены и т. Д. c. Как я могу настроить свой код или что я могу сделать, чтобы создать идеальное соединение для правильного сохранения всех данных.
Объяснение проблемы: У меня есть массив с
symbols=["ada","ae","kava","eth","etc","zrx","xzc","faq","gas","vfg","req"];
И когда я выхожу из код, скажем, 25 часов. Я предполагаю увидеть 50 документов на каждое название коллекции. Но я получаю, что в некоторых коллекциях было сохранено 48 документов вместо 50, в некоторых из них было сохранено 49, в некоторых из них было 50, например, иногда коллекции не сохраняли d должным образом.
FULLCODE HERE:
const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');
const fetch = require("node-fetch");
const symbols=["ada","ae","kava","eth","etc","zrx","xzc","faq","gas","vfg","req"];
//a descriptive name helps your future self and others understand code easier
const getBTCData = async symbol => { //make this function accept the current symbol
//async/await lets us write this much nicer and with less nested indents
let data = await fetch(`https://api.binance.com/api/v3/klines?symbol=${symbol}&interval=30m&limit=1`).then(res => res.json());
const btcusdtdata = data.map(d => {
return {
Open: parseFloat(d[1]),
High: parseFloat(d[2]),
Low: parseFloat(d[3]),
Close: parseFloat(d[4]),
Volume: parseFloat(d[5]),
Timespan: 30,
}
});
console.log(btcusdtdata);
saveToDatebase(symbol, btcusdtdata);
//recursive functions are complicated, we can get rid of it here
//by moving the responsibility to the caller
};
//helper function for an awaitable timeout
const sleep = ms => new Promise(res => setTimeout(res, ms));
const j = schedule.scheduleJob('*/30 * * * *', async() => {
//expand this function to be responsible for looping the data
for (let symbol of symbols) {
//we can pass symbol to getBTCData instead of making it
//responsible for figuring out which symbol it should get
await getBTCData(symbol);
await sleep(8000);
}
});
//make this a helper function so `saveToDatabase()` isn't also responsible for it
const getDateTime = () => {
let today = new Date();
let date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
let time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
return date + ' ' + time;
};
const saveToDatebase = async(symbol, BTCdata) => {
const url = 'mongodb://username:password@server:port/dbname?retryWrites=true&w=majority';
let dateTime = getDateTime();
//use await here and below to vastly simplify this function
let db = await MongoClient.connect(url, { useUnifiedTopology: true });
const dbo = db.db('Crypto');
const myobj = { Name: symbol, Array: BTCdata, Date: dateTime };
await dbo.collection(symbol).insertOne(myobj);
console.log('1 document inserted');
db.close();
};
Цель: Решить проблему с сохранением, я думаю, это также может быть возможно с самим ответом VPS. Как я могу обновить свой код, чтобы он выглядел чище и быстрее, если это возможно?
Любые предложения или помощь очень признательны.