Облачная функция Firebase request.body не определена - PullRequest
0 голосов
/ 24 октября 2019

Сторона пользователя: метод POST с использованием функции извлечения:

let response = await fetch(url, {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": JSON.stringify({"stripeToken": token.id})
});

Сторона сервера: URL-адрес для извлечения - функция облака Firebase:

const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
const stripe = require("stripe")("PRIVATE_KEY");

exports.chargeStripe = functions.https.onRequest( async (request, response) => {

    // Getting token
    let token = request.body.stripeToken;

    // Creating charge
    let charge = await stripe.charges.create({
        amount: 99,
        currency: 'eur',
        description: 'Payment',
        source: token
    });

    // Sending response
    charge ? send(response, 200, {message: 'Success'}) : send(response, 500, {message: 'Error!'});

});

Проблема в том, что я получаю console.log(token) → 'undefined'.

Обновление 1

Похоже, что Chrome (браузер) блокирует функцию выборки (политика CORS). Если я проверяю конечную точку через бессонницу, все работает нормально.

Итак, кто-то знает, что делать в этом случае?

Обновление 2

Благодаря Дуг Стивенсон я добавил промежуточное ПО CORS внутри функции:

exports.chargeStripe = functions.https.onRequest( (request, response) => {

    // Enable CORS using the `cors` express middleware.
    return cors(request, response, async () => {

        // Reading token
        let token = request.body.stripeToken;

        // Charging user
        let charge = await stripe.charges.create({
            amount: 99,
            currency: 'eur',
            description: 'Payment',
            source: token
        });

        // Sending response 
        response.status(200).send('Ok');
    });

}); 

Теперь все работает!

1 Ответ

0 голосов
/ 24 октября 2019

Благодаря Дугу Стивенсону я добавил cors package:

const cors = require('cors')({origin: true});

И затем я использовал промежуточное программное обеспечение CORS внутри функции. Итак, окончательное решение:

const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
const stripe = require("stripe")("PRIVATE_KEY");

exports.chargeStripe = functions.https.onRequest( (request, response) => {

    // Enable CORS using the `cors` express middleware.
    return cors(request, response, async () => {

        // Reading token
        let token = request.body.stripeToken;

        // Charging user
        let charge = await stripe.charges.create({
            amount: 99,
            currency: 'eur',
            description: 'Payment',
            source: token
        });

        // Sending response 
        response.status(200).send('Ok');
    });

}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...