Stripe.create функции не в правильном порядке - PullRequest
0 голосов
/ 12 марта 2020

Я хочу интегрировать Stripe в свое приложение. Я собрал все необходимые данные в req.body. Теперь возникает неопределенная ошибка после создания идентификатора клиента и при попытке передать его в addCustomerToCard. После этого createToken успешно регистрируется.

Итак, два вопроса: 1. Почему порядок вызова функций не вызывается так, как я ожидал? 2.Почему клиент не попадает в addCustomerToCard?

router.post("/checkout", async function (req, res, next) {
  if (!req.session.cart) {
    return res.redirect("/shopping-cart");
  }
  let createCustomer = function () {
    var param ={};
    param.email = req.body.email;
    param.name= req.body.name;
    param.description ="";
    return stripe.customers.create(param, function (err, customer) {
      if (err) {
        console.log("err:" + err);
      }
      if (customer) {
        console.log("success: " + JSON.stringify(customer, null, 2));
      } else {
        console.log("something went wrong");
      }
    });


  };

  let createToken = function () {
    let param ={};
    param.card = {
      number: req.body.card,
      exp_month: req.body.exp_month,
      exp_year: req.body.exp_year,
      cvc: req.body.security
  }
    return stripe.tokens.create(param, function (err, token) {
      if (err) {
        console.log("err:" + err);
        console.log(param);
      }
      if (token) {
        console.log("success: " + JSON.stringify(token, null, 2));
        console.log(req.body);
      } else {
        console.log("something went wrong");
      }
    });
  };




  let addCardToCustomer = function () {
    console.log(createdCustomer);
   return stripe.customers.createSource(customer.id, {source: token.id}, function (err, card) {
     if (err) {
       console.log("err:" + err);
       console.log(param);
     }
     if (card) {
       console.log("success: " + JSON.stringify(card, null, 2));
     } else {
       console.log("something went wrong");
     }
   });
 };

 let chargeCustomerThroughCustomerID = function () {
   let param = {
     amount: cart.totalPrice,
     currency: 'eur',
     description: 'First payment',
     customer: customer.id
   }

   stripe.charges.create(param, function (err, charge) {
     if (err) {
       console.log("err: " + err);
     }
     if (charge) {
       console.log("success: " + JSON.stringify(charge, null, 2));
     } else {
       console.log("Something wrong")
     }
   })
 }


  try {
    const createdCustomer = await createCustomer(); // promise 1
    const createdToken = await createToken();
    const addedCardToCustomer = await addCardToCustomer(createdCustomer,createdToken ); // 
    // const chargeCustomerThroughCustomerID = await chargeCustomerThroughCustomerID(); // promise 4


    res.send("success");

  } catch (e) {
    console.log(`error ${e}`)
  };



});

//LOG OUTPUT


//success
//error ReferenceError: createdCustomer is not defined
//success

1 Ответ

0 голосов
/ 13 марта 2020

Вы должны разбить это на более мелкие части, чтобы проверить поведение, которое вы ожидаете, для начала. Здесь происходит довольно много.

Одна проблема в том, что вы пытаетесь await функции, которые не async - вы должны пометить каждую функцию:

let createCustomer = async function () {...}

Это, вероятно, причина того, что последовательность не соответствует ожидаемой.

Вы получаете ошибку в addCardToCustomer, потому что createCustomer равен undefined в scope этой функции. Вам нужно иметь параметр:

let addCardToCustomer = async function (createdCustomer) { ... }
...