Получить полосу идентификатора клиента

0

Я работаю на веб-сайте с сервером в 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.

  • 0
    customer.id существует только внутри блока .then(customer => ...) ; это продолжение обещания . Предполагая, что данные о клиенте также находятся в объекте начисления (я не знаю API), и вы хотите записать клиента в базу данных только в том случае, если вы успешно установили начисление, вы, вероятно, захотите поместить свой код БД в .then(charge => res.render("charge.pug")) блок перед res.render. Возможно, вам также потребуется более изящная обработка ошибок Stripe.
  • 0
    Я новичок в полосе, пытаясь выяснить, как справиться со всеми ошибками. И да, я пытаюсь выяснить, как проверить, был ли платеж успешным
Теги:
stripe-payments

1 ответ

2
Лучший ответ

Переменная клиента существует только в рамках этой функции

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)
    })
});

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

  • 0
    Выглядит хорошо, но во втором случае я думаю, что материал БД принадлежит после создания подписки.
  • 0
    Большое спасибо. это очень помогает. Я не знал, как избавиться от «.hen», потому что я не совсем понял значение. Я пойду от этого и продолжу.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню