MongoDB пропускает сохранение данных в течение длительного периода времени - PullRequest
0 голосов
/ 13 июля 2020

Добрый день, у меня есть скрипт, который каждые 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. Как я могу обновить свой код, чтобы он выглядел чище и быстрее, если это возможно?

Любые предложения или помощь очень признательны.

...