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
предотвращает переназначение идентификатора, если это значение является объектом, тогда вы можете изменить содержимое объекта, но да, строка не может быть изменена примитивами против объектов
---- так что проблема была у меня.