Переменная customer существует только в рамках этой функции
customer => stripe.subscriptions.create({
plan: 'plan_EQoygL3d1jnHM2',
customer: customer.id
})
это сокращенная форма записи
function(customer) {
stripe.subscriptions.create({
plan: 'plan_EQoygL3d1jnHM2',
customer: customer.id
})
}
, и она вызывается, когда stripe.customers.createзаканчивает работуОн асинхронный, и я не буду вдаваться в подробности, но это просто означает, что он не блокирует поток выполнения, а вместо этого все переходит к следующей строке кода и вызывает вышеуказанную функцию всякий раз, когдаStripe API отвечает обратно.
Учитывая это, это означает, что сейчас происходит то, что
var values = [
[customer.id, email, generateKey(), datenow]
];
ДОЛЖЕН выдавать ошибку в соответствии с ReferenceError: покупатель не являетсяопределены
У вас есть несколько вариантов решения этой проблемы.
Самое простое для понимания и чтения, если вы используете версию узла выше 7,6 (введите node -v
вваш терминал / cmd), используя async / await для обработки асинхронного вызова как такового
app.post("/charge", async (req, res) => {
try {
var customer = await stripe.customers.create({
email: req.body.stripeEmail,
source: req.body.stripeToken
})
await stripe.subscriptions.create({ // no point in awaiting here
plan: 'plan_EQoygL3d1jnHM2',
customer: customer.id
}))
res.render("charge.pug")
var sql = "INSERT INTO authentification (customerID, email, discord_key, datePayement) values ?";
var datenow = new Date();
var values = [
[customer.id, customer.email, generateKey(), datenow]
];
DB.query(sql, values, function (err, result) {
if (err) throw err;
console.log(result);
});
} catch (ex) {
console.error('/charge encountered exception', exception) // the try/catch block is optional, but should help you figure out further problems along the way
res.sendStatus(503)
}
});
Если, однако, вы ограничены более низкой версией Node, вы можете продолжать использовать Promises (кратко,.then
шаблон, который вы видите) как таковой
app.post("/charge", (req, res) => {
stripe.customers.create({
email: req.body.stripeEmail,
source: req.body.stripeToken
}).then(customer => {
var sql = "INSERT INTO authentification (customerID, email, discord_key, datePayement) values ?";
var datenow = new Date();
var values = [
[customer.id, customer.email, generateKey(), datenow]
];
DB.query(sql, values, function (err, result) {
if (err) throw err;
console.log(result);
});
return stripe.subscriptions.create({ // returning a Promise here means the next .then will wait for it to solve, before rendering 'charge.pug'
plan: 'plan_EQoygL3d1jnHM2',
customer: customer.id
})
})
.then(charge => res.render("charge.pug"));
.catch(exception => {
console.error('/charge encountered exception', exception) // the .catch is optional, but should help you figure out further problems along the way
res.sendStatus(503)
})
});
Надеюсь, это поможет!