Узел: Сохранить сгенерированную полосу "Идентификатор клиента" в переменной - PullRequest
0 голосов
/ 19 февраля 2019

Когда новый пользователь регистрируется на моей странице, я также хочу создать идентификатор клиента Stripe, чтобы сохранить его, помимо имени пользователя и адреса электронной почты, в базе данных.Все идет нормально.Создание клиента работает так, как я вижу на тестовой панели Stripe.

Но как я могу сохранить ответ Stripe, его идентификатор клиента, в новой переменной для дальнейшего использования?

stripe.customers.create({
  email: req.body.email.toLowerCase(),
}).then(response => {
  customerId = response.id
  });
console.log(customerId)

Обновление кода после предложения @bharadhwaj await / async:

async function stripeCustomerCreation() {
  const response = await stripe.customers.create({
    email: req.body.email.toLowerCase(),
  })
  customerId = response.id
};
stripeCustomerCreation();
console.log(customerId)
// Create new user object and apply user input
let user = new User({
  email: req.body.email.toLowerCase(),
  username: req.body.username.toLowerCase(),
  password: req.body.password
});

Обновление 2: Консоль дает мне обещание, но ни одной CustomerId в одну строкув дальнейшем.: (

async function stripeCustomerCreation() {
  const response = await stripe.customers.create({
    email: req.body.email.toLowerCase(),
  })
  customerId = response.id
  return customerId
};
var customerId = stripeCustomerCreation();
console.log(customerId)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

МЕТОД 1

При вызове функции async снова вам нужно добавить await перед ней, чтобы она заработала.Я полагаю, что эта цепочка создания функций async может продолжаться, пока все не будет в async/await;)

async function stripeCustomerCreation() {
    const response = await stripe.customers.create({
        email: req.body.email.toLowerCase(),
    })
    customerId = response.id
    return customerId
};

const customerId = await stripeCustomerCreation();
console.log(customerId)

// Create new user object and apply user input
let user = new User({
    email: req.body.email.toLowerCase(),
    username: req.body.username.toLowerCase(),
    password: req.body.password
});

МЕТОД 2

stripe.customers.create({
    email: req.body.email.toLowerCase(),
}).then(response => {
    customerId = response.id
    console.log(customerId) // defined

    // Create new user object and apply user input
    let user = new User({
         email: req.body.email.toLowerCase(),
         username: req.body.username.toLowerCase(),
         password: req.body.password
    });
});

Для текущего имеющегося кода мы можем решить его с помощью приведенного ниже кода.

Назначение функции async напрямую дает вам обещание разрешить.Тогда вам нужно resolve, как показано ниже:

async function stripeCustomerCreation() {
  const response = await stripe.customers.create({
    email: req.body.email.toLowerCase(),
  })
  customerId = response.id
  return customerId
};
stripeCustomerCreation()
  .then(customerId => {
    console.log(customerId) // Defined
  });
0 голосов
/ 19 февраля 2019

Это из-за асинхронного поведения кода.

// Statement 1
stripe.customers.create({
    email: req.body.email.toLowerCase(),
}).then(response => {
    customerId = response.id
    // customerId is defined here
}); 

// Statement 2
console.log(customerId)

Порядок выполнения выше:

Оператор 2

Оператор 1

Это потому что Statement 1 - это операция с БД, выполнение которой занимает больше времени, чем Statement 2.Итак, Statement 2 запускается первым, тогда переменная response не определена.Вот почему вы получаете неопределенное значение.

Для правильного доступа к переменной customerId у нас есть несколько способов:

МЕТОД 1

Если вы знакомы с async/await:

const response = await stripe.customers.create({
    email: req.body.email.toLowerCase(),
})
customerId = response.id

console.log(customerId) // defined

Примечание: для того, чтобы await работал, он должен вызываться внутри функции async.


МЕТОД 2

stripe.customers.create({
    email: req.body.email.toLowerCase(),
}).then(response => {
    customerId = response.id
    console.log(customerId) // defined
    // Rest of your code here
});

Примечание. Это может привести к ситуации, называемой обещаниями цепочки.Попробуйте Googling!


Вы можете выбрать любой из этих методов, чтобы он работал в соответствии с вашим удобством.

Надеюсь, это поможет!:)

...