Я работаю на веб-сайте с сервером в nodeJS.
Я реализовал полосовой API, чтобы люди платили каждый месяц.
Мне нужно получить их email/custumer_ID в моей базе данных (вместе с другой информацией), но мне не удается получить эту информацию.
вот мой код:
app.post("/charge", (req, res) => {
stripe.customers.create({
email: req.body.stripeEmail,
source: req.body.stripeToken
})
.then(customer =>
stripe.subscriptions.create({
plan: 'plan_EQoygL3d1jnHM2',
customer: customer.id
}))
.then(charge => res.render("charge.pug"));
var sql = "INSERT INTO authentification (customerID, email, discord_key, datePayement) values ?";
var datenow = new Date();
var values = [
[customer.id, email, generateKey(), datenow]
];
DB.query(sql, values, function (err, result) {
if (err) throw err;
console.log(result);
});
});
Это ошибка, которую я получаю:
ReferenceError: customer is not defined.
Customer not defined on this part :
var values = [
[customer.id, email, generateKey(), datenow]
];
Я также хотел знать, был ли защищен способ, которым я это сделал, или были ли другие способы сделать это?
Большое спасибо за Вашу помощь !
Я новичок в узле JS.
Переменная клиента существует только в рамках этой функции
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, вы можете продолжать использовать обещания (кратко, шаблон .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)
})
});
Надеюсь это поможет!
.then(customer => ...)
; это продолжение обещания . Предполагая, что данные о клиенте также находятся в объекте начисления (я не знаю API), и вы хотите записать клиента в базу данных только в том случае, если вы успешно установили начисление, вы, вероятно, захотите поместить свой код БД в.then(charge => res.render("charge.pug"))
блок перед res.render. Возможно, вам также потребуется более изящная обработка ошибок Stripe.