Читайте синхронно данные из Монго с Метеором - PullRequest
0 голосов
/ 27 августа 2018

Мне нужна помощь с асинхронными методами, MongoDB и Meteor.Я пробовал Generators, async / await, Promisses, но ничего не решает мою проблему.

У меня есть функция, которая возвращает меня, если у пользователя есть разрешение на роль или нет.Эта функция вызывает другую для получения всех пользовательских ролей.Поэтому я запрашиваю Mongo с агрегатной функцией, чтобы восстановить список разрешений, которые есть у этого пользователя.

Но мне нужны результаты БД синхронно, как Meteor с другими методами.Как я могу это сделать?

class PermsServer {
    has(role, companyIds = null, value = null){
        const self = this;
        const rolesData = self._getRoles(role, companyIds);

        if (!rolesData[0]) return false;

        // Check roles
        const hasRole = self._checkType(rolesData[0], value);
        return hasRole;
    }

    _getRoles(roles = null, companyIds = null){
        const self = this;
        const cursor = self.dataScope.aggregate([
            {
                $match: filter
            },
            {
                $lookup: {
                    from: 'nx_perms',
                    localField: 'role',
                    foreignField: 'role',
                    as: 'perm_docs'
                }
            }
        ]);

        return cursor.toArray(); // This returns a promisse 'Pending'
    }
}

PS: я хочу, чтобы результат _getRoles был синхронизирован

1 Ответ

0 голосов
/ 29 августа 2018

Изменения в драйвере MongoDB передают AggregationCursor обратному вызову, тогда как версия 2.x передает результат агрегирования.Проверьте проблему # 9936

Для Meteor 1.7 мы можем использовать:

import { Promise } from "meteor/promise";
const result = Promise.await(rawDonations.aggregate(pipeline).toArray());

Другая моя проблема в том, что я отлаживаю тест с мокко, и я получаю Timeoutошибка.Поэтому я решил установить время ожидания на 0.

it('is SuperAdmin', function(){
    this.timeout(0);
    ...
...