Meteor 1.6 делает синхронный вызов как на стороне клиента, так и на стороне сервера - PullRequest
0 голосов
/ 31 мая 2018

В настоящее время я работаю над менеджером коллекции, который также управляет внешними ключами.Он также генерирует некоторые формы, и у меня возникают проблемы с проверкой внешних ключей и получением правильных обратных вызовов для клиента.

Я использую метод wrapAsync от meteor для использования синхронной версии вызова метода.

Сначала я объявляю синхронный вызов функции методом "check fk".

declareCheckFKMethod(index){
        Meteor.methods({
             [this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix]:(fk)=>{
                var syncFunc = Meteor.wrapAsync(this.checkFKInDB.bind(this));
                return syncFunc(fk,index)
            }
        })
    }

Вот целевая функция:

checkFKInDB(fk,collectionIndex,callBack){
        try{
           var test = this._collectionList[collectionIndex].find({_id:fk}).fetch();
           if(test.length==1){
               return callBack(null,true);
           }
           else{
               return callBack(null,false);
           }
        }
        catch(e){
            return callBack(new Meteor.Error("DB error", e.message),null)
        }
    }

Затем в моей функции вставки Iпроверьте все поля FK как на стороне клиента, так и на стороне сервера:

const check = Meteor.call(this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix,document[element.entryName]);
console.log(check)

И вот что я получаю, когда вставляю действительный документ:

Журнал консоли на стороне сервера: true

Журнал консоли на стороне клиента: undefined

Я подозреваю, что клиентская сторона просто не ждет обратного вызова, а сервер делает.Как я мог это исправить?(Кстати, я пытался использовать ключевые слова await / async, но это просто дает мне ошибки ...)

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я на самом деле нашел решение, но я не уверен, почему оно работает, если кто-то мог бы четко объяснить:

Мне просто нужно было сделать серверную и клиентскую функцию "checkFKInDB" следующим образом:

checkFKInDB(fk,collectionIndex,callBack){
    if(Meteor.isClient){
        try{
           var test = this._collectionList[collectionIndex].find({_id:fk}).fetch();
           if(test.length==1){
               return true;
           }
           else{
               return false;
           }
        }
        catch(e){
            throw new Meteor.Error("DB error", e.message);
        }
    }
    if(Meteor.isServer){
        try{
           var test = this._collectionList[collectionIndex].find({_id:fk}).fetch();
           if(test.length==1){
               return callBack(null,true);
           }
           else{
               return callBack(null,false);
           }
        }
        catch(e){
            throw new Meteor.Error("DB error", e.message)
        }
    }
}

Тогда:

try{

      test = Meteor.call(this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix,document[element.entryName]);
}
catch(e){
      throw new Meteor.Error("DB error",e.message)
}

Если кто-то может объяснить, почему обратный вызов необходим на стороне сервера, а не на клиенте, это было бы здорово!

0 голосов
/ 31 мая 2018

Вашей клиентской функции всегда необходимо для передачи обратного вызова для получения асинхронного результата:

Meteor.call(this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix,document[element.entryName], (err, check) => {
  console.log(err, check);
});

Редактировать: Для вашего уведомления МетеорМетод разрешит значения в методе Promise style (подробнее о том, как работают Fibers), в то время как ваш клиент всегда будет получать результат или ошибку в стиле обратного вызова.Так что идея иметь какой-то шаблон асинхронного / ожидающего стиля на клиенте при вызове методов может не сработать таким образом.

...