Witam,
tworzę aplikację backend nodejs, baza danych mongodb, front react. Wszystko raczej dobrze działa, system logowania, rejestracji, pobieranie z bazy danych, ale podczas aktualizacji dokumentów w bazie danych, dokładnie chodzi o kolekcję ok 13 tys dokumentów z nazwą i ceną, co jakiś czas planuję aktualizację tej kolekcji za pomocą API. Zrobiłem tak, że najpierw przez API wyciągam to co potrzebuję i tworzę tablicę z tymi danymi, potem przy pomocy findOneAndUpdate przeszukuję daną kolekcję i jeśli dokument się znajduję to aktualizuję cenę, a jeśli nie to dodaję nowy. Nie wiem czy w ogóle dobrze to robię, bo jak tylko uruchomię te funkcję to nic innego w ciągu tych kilkunastu sekund nie mogę zrobić na stronie, logowanie zawiesza się, pobieranie z bazy danych też, strona wisi do poki proces aktualizacji nie zostanie zakonczony. Proszę o pomoc, jak uniknąć takiego konfliktu, z góry dziękuję i pozdrawiam
module.exports = getAllItemPrices = async () => {
try {
const key = process.env.BITSKINS_KEY;
const secret = process.env.BITSKINS_SECRET;
const code = totp.gen(base32.decode(secret));
// const items = {};
const response = await axios.post(
`https://bitskins.com/api/v1/get_all_item_prices/?api_key=${key}&app_id=730&code=${code}`
);
const allowed = [
"app_id",
"market_hash_name",
"price",
"pricing_mode",
"skewness",
"icon_url",
"quality_color"
];
const prices = await response.data.prices;
//
// Filtrujemy obiekty, aby zawierały tylko to co w zmiennej allowed
//
const items = await prices.map(item => {
// console.log(item);
return (item = filtered = allowed.reduce(
(obj, key) => ({ ...obj, [key]: item[key] }),
{}
));
});
await items.map(item => {
const { market_hash_name, price } = item;
// console.log(item.market_hash_name);
const options = { upsert: true, setDefaultsOnInsert: true };
ItemPrice.findOneAndUpdate(
{ price: price },
{ price: price },
options,
(err, item) => {
if (err) {
console.log(err);
} else {
// item.save();
}
}
);
});
return items;
} catch (err) {
console.log(err);
}
};