Это из-за асинхронного поведения кода.
// 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!
Вы можете выбрать любой из этих методов, чтобы он работал в соответствии с вашим удобством.
Надеюсь, это поможет!:)