Hapi 17 Stripe прерывистый сбой

Я полностью сбит с толку. У меня есть маршрут оплаты, который позволяет людям платить через PayPal или чередование. В зависимости от их местоположения, они будут платить в долларах США или фунтах / евро.

У меня есть два шлюза в полоску, один для США, другой для Великобритании / ЕС.

Форма оплаты - "Как есть", Stripe Checkout и отправлена ​​на передний конец.

Большую часть времени я могу совершать платежи без проблем - без проблем переключаться между США и Великобританией.

Тем не менее, иногда я получаю следующее сообщение об ошибке:

Debug: internal, implementation, error 
    TypeError: stripe is not a function

указывая на строку в моем файле stripe.js, где я установил полосу с секретным ключом. Я запутался, потому что это работает большую часть времени - и это метод.

Я обновляю браузер, и, кажется, все в порядке, чтобы потом сломаться.

pay.js

    const stripeMethods = require("./../../utilities/stripe.js");
    const braintreeMethods = require("./../../utilities/braintree.js");

    module.exports = {
        method: ["POST"],
        path: "/pay/{task}",
        options: {
            // ... validations, removed
            async handler(request, h) {

                let cart = request.session.cart;
                let orderid = await request.getUniqueToken(8, 'order', 'orderid'); // generate order id
                let charge;

                switch (request.params.task) {
                    case "stripe":
                        charge = await stripeMethods.charge(request.payload.token, cart, orderid);
                        cart.paymentType = 'stripe';
                        break;
                    case "paypal":
                        charge = await braintreeMethods.charge(request.payload.token, cart, orderid);
                        cart.paymentType = 'paypal';
                        break;
                }
                // .... do a bunch of stuff with createOrder - removed
            }
        }
    };

stripe.js содержит следующее:

 <!-- language: lang-js -->

let stripe = require('stripe');

const charge = async (token, cart, orderid) => {

    try {
        if (cart.total.currency === 'GBP' || cart.total.currency === 'EUR') {
            stripe = stripe('###########'); // secret for UK Stripe, hardwired in for testing
        } else {
            stripe = stripe('##########'); // secret for USA Stripe
        }
        let charge = await stripe.charges.create({
            amount: Math.trunc(cart.total.total), // truncates without rounding
            currency: cart.total.currency,
            source: token, // obtained with Stripe.js
            description: `....`
        });

И периодически я получаю следующую ошибку... Stripe - это не функция. Кажется, что это происходит случайно (конечно, я знаю, что это не случайно... Я просто еще не смог определить образец).

Debug: internal, implementation, error 
    TypeError: stripe is not a function
    at Object.charge (.../utilities/stripe.js:8:18)
    at handler (.../web/routes/pay.js:51:50)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:160:7)

Я запускаю метод внутри обработчика onPostAuth, чтобы определить наличие корзины.

Теоретически, он должен работать только тогда, когда нет тележки. Таким образом, когда клиент впервые заходит на сайт, и когда клиент выписывается (корзина стирается и повторно инициализируется)

   if (request.session && !request.session.cart) {
        console.log('RUNNING WHEN PATH?', request.path)
        request.session.cart = cartMethods.cartSetup(); // if no cart - set one up
    }

Я выхожу из пути, где корзина сообщает как пропавшая без вести. Кажется, он запускается при попадании в файлы css.map.. (страница корзины - это приложение vue.js - извлечение - это просто страница html

Я думаю, в первую очередь, я должен изменить свой onPostAuth, чтобы игнорировать что-либо с.map в пути

** РЕДАКТИРОВАТЬ **

Исходя из комментария @karllekko - мне потребовались мои Великобритания и США во главе файла - и я ссылался на эти переменные внутри моего метода.

let ukStripe = require('stripe'('sk_test_#######################');
let usStripe = require('stripe')('sk_test_#######################');

const charge = async (token, cart, orderid) => {
    try {
        let stripe;
        if (cart.total.currency === 'GBP' || cart.total.currency === 'EUR') {
            stripe = ukStripe;
        } else {
            stripe = usStripe;
        }

Это работает - оплата после оплаты обязательно. Тем не менее, это беспокоит меня... действительно беспокоит меня. Я не могу понять, почему это работает. Масштаб не должен был быть проблемой... если бы кто-то мог поделиться какой-то информацией, это было бы здорово. Я гуглил - но не нашел ответов на вопрос, почему.

** Редактировать **

Говорил с моим приятелем Дейвом - теперь это невероятно очевидно... Я бью себя...

Дейв [9:52 утра] это довольно очевидно, что вы переназначаете stripe каждый разstripe = stripe('###########')

грабить [9:52 утра].... О, дерьмо.... ты прав

Дейв [9:52 утра]stripe = _return value of stripe()_

Дейв [9:52 AM] совет: никогда не используйте letвсегда использовать constТаким образом, если вы делаете это случайно, вы можете увидеть, где

rob [9:53 AM]:+1: const относится к типу, не так ли?

Дэйв [9:53 утра] нет

грабить [9:53 AM] (если это не строка - тогда значение)

Дэйв [9:53 AM]const предотвращает переназначение идентификатора, если это значение является объектом, тогда вы можете изменить содержимое объекта, но да, строка не может быть изменена примитивами против объектов

---- так что проблема была у меня.

0 ответов

Другие вопросы по тегам