Получить полосу идентификатора клиента - PullRequest
0 голосов
/ 31 января 2019

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

1 Ответ

0 голосов
/ 31 января 2019

Переменная 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)
    })
});

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

...