Извлекать данные, редактировать коллекцию MongoDB перед загрузкой веб-приложения? Async, обещания? - PullRequest
0 голосов
/ 24 октября 2019

Я использую MongoDB и NodeJS и пытаюсь предварительно загружать мою коллекцию customers при каждой загрузке сайта. Я очищаю его, заполняю его пустыми документами и, наконец, заменяю (если имеется) любой из них реальными данными из внешнего источника.

Я пытался использовать save(), но он выдает сообщение об ошибке 'ParallelSaveError' - Can't save() the same doc multiple times in parallel. Document: 3". Это не выборка данных перед рендерингом. Это приводит к отсутствию элементов в панели управления, отображается только один или два. Я прочитал кое-что об асинхронных функциях и обещаниях, но я не уверен, как применять их в моем случае. Как это реализовать?

dbtools.js

var empty = new Customer({
  _id: '',
  name: 'Unused',
  surname: '',
  birthday: '',
  deathday: '',
  phx: false,
  ntw: false,
  gender: 'empty'
});

module.exports = {
  getCustomers: async function() {
    // Fill array with empty slots
    slots = [empty, empty, empty];

    // Clearing collection
    Customer.deleteMany({}, function(err) {});

    // Looping through Array, add each Document
    for (i = 0; i < slots.length; i++) {
      slots[i]._id = i+1;

      mongoose.connection.collection('customers').insert(slots[i]);
      // or
      slots[i].save(function (err) { if (err) return handleError(err); });
    }
    // Updating with external data
    ..
  }
}

router.js

var tools = require('./dbtools.js');
..
router.get('/', function (req, res) {
  tools.getCustomers();
        Customer.find({}, function (err, customers) {
    if (err) return handleError(err);
    res.render('dashboard', {
      title: 'Overview',
      customers: customers
    });
  });
});
..

1 Ответ

0 голосов
/ 24 октября 2019

На основании async в функции getCustomers, что внутри функции есть Promises / асинхронные вызовы. Если это так, то для любых функций, вызывающих эту функцию, требуется await впереди, чтобы перехватить асинхронный обратный вызов.

router.get('/', function(req, res) {
    try {
        const customers = await tools.getCustomers();
        res.render(...);
    } catch (e) {
        return handleError(err);
    }
});

Скажите, пожалуйста, поможет ли это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...