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