Почему эти асинхронные / ожидающие вызовы не работают должным образом? - PullRequest
0 голосов
/ 25 января 2019

Помогите пожалуйста !! Во время выполнения обоих вызовов await в createPayment() и в Stripe API char.create () выполнение производится случайным образом, а не в порядке, как ожидалось. Мой код входит в createPayment(), затем возвращается к const {payment} = await createPayment(program, user, toUser, paymentToken);, затем снова входит внутрь createPayment(), это не имеет смысла !!!!

exports.subscribeToProgram = async function(req,res){
try {
    const {paymentToken, program} = req.body;
    const user = res.locals.user;

    //Find program to be subscribed
    const foundProgram = await Program.findOne({_id: program._id}).populate('user').exec();
    const toUser = foundProgram.user.id;
    if(toUser === user.id)
    {
        return res.status(422).send({errors: [{title: 'Invalid User!', detail: 'You can\'t subscribe to your own program!'}]})
    }

    // Create Payment
    // THIS PART IS NOT WORKING PROPERLY!!!! 
    const {payment} = await createPayment(program, user, toUser, paymentToken);
    const charge = await stripe.charges.create({
        amount: foundProgram.price * 100 * CUSTOMER_SHARE,
        currency: 'usd',
        description: 'Example charge',
        source: payment.tokenId,
    });

    //If payment was created successfully
    if(payment && charge)
    {
        //Create subscription
        //Save created subscription
        //Append a booking to bookings array
    }else{
        return res.status(422).send({errors: [{title: 'Payment declined!', detail: err }]})
    }
} catch (err) {
    console.log(err)
    return res.status(422).send(err);  
}
}

CreatePayment ()

async function createPayment(program, user, toUser, token){
//Get user from booking
const userToCharge  = user;

//Create customer from stripe serices
const customer = await stripe.customers.create({
    source: token.id,
    email: userToCharge.email
});

//If custome exist
if(customer)
{
    //Update user
    User.updateOne({_id: userToCharge.id}, {$set: {stripeCustomerId: customer.id}}, () => {});

    //Create Payment
    const payment = new Payment({
        fromUser: userToCharge,
        toUser, //Destructurize value
        fromStripeCustomerId: customer.id,
        program,
        tokenId: token.id,
        amount: program.price * 100 * CUSTOMER_SHARE // 80% of value if for 
    });

    //Save payment
    try 
    {
        const savedPayment = await payment.save();
        return {payment: savedPayment}
    } 
    catch (error) 
    {
        return {err: err.message};
    }
}else{
    return { err: 'Cannot process Payment!'}
}

}

1 Ответ

0 голосов
/ 25 января 2019

Два вопроса, оба внутри createPayment

  1. Вам необходимо await User.updateOne вызвать, поскольку это также асинхронно
  2. В случае отсутствия customerбудучи найденным, вам все равно придется вернуть объект, иначе ваша деструктура выдаст ошибку.
...