Hapi 17条纹间歇性故障

时间:2018-07-19 15:28:56

标签: javascript node.js stripe-payments hapi.js

我完全困惑。我有一条付款途径,可以使人们通过Paypal或条纹付款。根据他们的位置,他们将以美元或英镑/欧元支付。

我有两个条带化网关,一个用于美国,另一个用于UK / EU。

付款方式为“按原样” Stripe Checkout,并放置在前端。

在大多数情况下,我能够付款而没有任何问题-在美国和英国之间切换不会有任何问题。

但是,偶尔我会收到以下错误消息:

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

指向我的stripe.js文件中的行,在该行中我用密钥设置了stripe。我很困惑,因为它在大多数时间都有效-并且是一种方法。

我刷新了浏览器,似乎还可以,以后再打开。

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;
        }

这是有效的-每次付款后都可以成功付款。但是,它困扰我...真的困扰我。我不知道为什么这可行。范围不应该成为问题...如果任何人都可以分享任何见解,那将是很好的。我已经在Google上搜索了-但未找到任何答案。

**编辑**

与我的好朋友戴夫(Dave)交谈-现在非常明显...我在踢自己...

戴夫[9:52 AM] 这很明显 您每次都重新分配stripe stripe = stripe('###########')

抢劫[上午9:52] ....哎呀....你是对的

戴夫[9:52 AM] stripe = _return value of stripe()_

戴夫[9:52 AM] 提示:请勿使用let 始终使用const 这样,如果您不小心这样做了,您可以看到哪里

抢劫[上午9:53] :+1:const指的是类型吗?

戴夫[上午9:53] 否

抢劫[上午9:53] (除非它是字符串-然后是值)

戴夫[上午9:53] const防止重新分配标识符 如果该值是一个对象,那么请确保您可以更改对象的内容,但是是的,不能修改字符串 基本对象与对象

----所以问题出在我身上。

0 个答案:

没有答案