Не удается вставить mogodb в цепочку обещаний с помощью meteor

#mongodb #meteor #promise

#mongodb #meteor #обещание

Вопрос:

Нужна помощь с препятствием.

Я использую пакет npm на основе обещаний для извлечения благотворительных данных. Пакет основан на обещаниях, поэтому я использую цепочку обещаний для анализа и извлечения данных. Все это работает хорошо. Я могу создать клиент soap, выполнить поиск данных, извлечь данные, проанализировать данные в массив объектов, готовых для записи в mongo db, но проблема заключается в этом последнем шаге.

Если я запишу один образец объекта в БД в final .then(), он застревает / останавливается и даже не возвращает ошибку. Я могу записывать в БД до начала цепочки обещаний, но не внутри. Я предпочитаю использовать собственные обещания, а не какую-либо внешнюю библиотеку. Чего мне здесь не хватает?

 // dummy data
const test = {
    CharityName: 'test'
};

Meteor.startup(function() {
    // init the db here.
    console.log(`Meteor started`);
    console.log(Charities.find().count());

    // *1 Charities.insert(test);

    if (Charities.find().count() === 0) {
        console.log('dbs is empty');
        ccAPI.createClient(ccAPIUrl)
            .then(function(client) {

                // *2 Charities.insert(test);

                console.log('searching for charitites');
                return GetCharitiesByKeywordList(client, { APIKey }, ["searchTerm"]);
        })
        .then(function(obj) {
            console.log('fetching all charities');
            const { client, res } = obj;
            return fetchAllCharities(client, { APIKey }, res);
        })
        .then(function(val) {
            console.log(`parse returned data with makeData()`);
            return makeData(val);
        })
        .then(function(val) {
            console.log(`writing objects to db`);

            // *3 Charities.insert(test);

        })
        .catch(function(error) {
            throw error;
        });
}
});
  

* 1 работает, но * 2 и * 3, похоже, приостанавливают выполнение кода. Детали вызовов библиотеки не имеют значения, здесь важно то, что я не могу записывать в БД из цепочки обещаний.

Комментарии:

1. Возникает ли ошибка, если вы возвращаете значение Charities.insert() ? Так ли это Meteor code must always run within a Fiber ?

2. @JeremyS. Ошибка не обнаружена.

Ответ №1:

Хитрость здесь заключалась в использовании Collection.rawCollection() в документах meteor API и этом объяснении на форумах

Итак, теперь это строка, которая работает:

 Charities.rawCollection().insert(test);
  

Комментарии:

1. Я собирался опубликовать ….. Вы уверены, что ошибка не проглатывается? .catch(function(error) { throw error; }); просто передает ошибку, поэтому вам нужно будет добавить console.log(error) (или зарегистрировать ошибку в вызывающем Meteor.startup). Из любопытства, приведет Charities.insert(test) ли это к регистрации ошибки?

2. @Roamer-1888 отличный момент, когда я на самом деле утешаю ошибку, см. [Ошибка: код Meteor всегда должен выполняться внутри волокна. Попробуйте обернуть обратные вызовы, которые вы передаете в не метеорные библиотеки, с помощью Meteor.bindEnvironment.] но не тогда, когда я просто Meteor.error(error) или throw error . Сообщение об ошибке бесполезно, и документы недостаточно ясны, чтобы избежать этой проблемы. Необходимость использовать rawCollection() немного hacky напрягает. Я попытался bindEnvironment обойти обратный вызов, у меня это не сработало.

3. Ага, по крайней мере, это подтверждает теорию @JeremyS. о «волокне». Я прочитал о волокнах Meteor около года назад для какого-то проекта и должен признаться, что я быстро забыл обо всем этом. Мне нужно вернуться к основам, чтобы посоветовать дальше.