someMethod = new ValidatedMethod({
name: 'someMethodName',
validate: new SimpleSchema({
subId: {type: String, min:1},
planId: {type: String}
}).validator(),
async run(params){
try{
//params is undefined
}
}
});
Использование async run(params) приводит к тому, что params становится undefined (похоже, что контекст переключается на контекст Global). Удаление async работает нормально (за исключением того, что я больше не могу использовать await в теле метода).
Почему так, и как я могу использовать await внутри ValidatedMethod?
Примечание1: Я вызываю метод из клиента вот так -- и получаю тот же результат, если пытаюсь использовать обычное определение Meteor.methods({}). Я вызываю метод с помощью Meteor.apply с клиента
ClientHelpers.callWithPromise = function(methodName, methodArgs){
//methodArgs must be an array
return new Promise(function(resolve, reject){
Meteor.apply(methodName, methodArgs, {wait:true}, function(error, result){
if (error){
reject(error);
}
console.info(result);
resolve(result);
});
});
}
Затем вызов на клиенте (уверен, paramsObject правильный):
var myResult = await ClientHelpers.callWithPromise('someMethodName', [paramsObject]);
Заметка 2: Я также проследил это до внутренностей Meteor.apply , где он фактически отправляет paramsObject через DDP в сеансе отладки:
// Sends the DDP stringification of the given message object
_send(obj) {
this._stream.send(DDPCommon.stringifyDDP(obj));
}
Большое спасибо за любое понимание.
Спасибо, да - функция ClientHelpers.callWithPromise в моем коде делает то же самое. Я считаю, что проблема заключается в использовании ожидания в коде на стороне сервера, когда мне нужно использовать Promise.await() в соответствии с github.com/метеор/метеор/проблемы/9473. Я не совсем понимаю, почему, но, кажется, помогает.





Вы уже пробовали callpromise-mixin для ValidatedMethods? атмосфераjs.com/didericis/callpromise-mixin