2014-12-05 2 views
4

Я пытаюсь получить платежи Braintree в приложении Meteor. Я застрял в попытке вернуть результат создания маркера (серверная сторона, через метод Метеор), который будет использоваться на стороне клиента.Meteor Braintree - Создать токен клиента с помощью метода Meteor

Я попытался это:

/server/braintree.js

Meteor.methods({ 
    createClientToken: function() { 

    var token = gateway.clientToken.generate({ 
     customerId: this.userId 
     }, function(err, response) { 
      clientToken = response.clientToken 
      return clientToken 
     } 
    ) 

    console.log(token) 
    return token 
    } 
}) 

который возвращает true.

Я также попытался это:

Meteor.methods({ 
    createClientToken: function() { 

    var clientToken 
    gateway.clientToken.generate({ 
     customerId: this.userId 
     }, function(err, response) { 
      clientToken = response.clientToken 
     } 
    ) 

    console.log(clientToken) 
    return clientToken 
    } 
}) 

Который возвращает undefined.

function(err, response) вызывается асинхронно, да? Если это так, это будет объяснение проблемы. Кажется, что попытка вернуть значение из асинхронной функции - это немного больная точка в Javascript. Я прочитал несколько ответов SO на нем (например, this one, this one и this one), но никто, кажется, не привел меня в правильном направлении.

Кроме того, я считаю, что мне, возможно, придется использовать метод Метеор wrapAsync, правильно? Я пробовал это (и нашел this и this релевантные ВОПРОСЫ на него), но все же, похоже, все не так.

Благодарен за любые отзывы.

Update:

Для рабочего подхода к интеграции Брейнтри с Метеор, проверьте example repo (большое спасибо @Nick Томлин для этого)

+1

Я могу подтвердить, что функция обратного вызова (err, response) 'для' gateway.clientToken.generate' называется асинхронно.Однако я не могу ручаться за определенные обходные методы Meteor :( – mrak

ответ

5

Отказ от ответственности: Я работаю Брэйнтри :)

Я не знаком с Meteor, но, как заметил @mrak, clientToken.generate является асинхронным, и вы определенно справитесь с этим в своем методе.

В текущем коде, clientToken не определен, поскольку console.log(clientToken) выполняется немедленно, прежде чем вы получите clientToken от обратного вызова для clientToken.generate. Асинхронное программирование может занять некоторое время, чтобы обернуть голову, если вы привыкли к кодированию в синхронном режиме, но есть много ресурсов, которые помогут вам (вот one).

Похоже, что Meteor.wrapAsync действительно предоставит вам то, что вам нужно, вот untested пример реализации.

Meteor.methods({ 
    createClientToken: function() { 
    var createToken = Meteor.wrapAsync(gateway.clientToken.generate, gateway.clientToken); 

    var response = createToken({}); 

    return response.clientToken; 
    } 
}); 

Update

Я создал очень простой Braintree + Meteor application, который может быть полезен для вас (если это не так, пожалуйста, подать вопрос на репо GH, чтобы помочь улучшить его!)

+0

Спасибо за помощь @Nick Tomlin. С приведенным выше я получаю ошибку сервера 500, которая сообщает об ошибке «Исключение при вызове метода createClientToken» TypeError: Object [object Object] имеет no method 'validateParams''. Кажется, что 'createClientToken' не хочет объекта, который, как я полагаю, передается, передавая' this' вместе с методом generateToken' wrapAsync? –

+0

@IsaacGregson Я, возможно, сбил вас с пути контекст передается как второй аргумент 'wrapAsync'. Измените вызов на:' Meteor.wrapAsync (gateway.clientToken.generate); 'и все должно быть в порядке. Я также отредактировал свой ответ. –

+0

Хмм ... Я уже пробовал это, и он возвращает ту же ошибку сервера (500), только на этот раз она читает: 'TypeError: Object # не имеет метода 'validateParams''. Идеи? –

Смежные вопросы