Мой запрос POST НЕ РАЗРЕШЕН в производственной среде

Я впервые пишу о помощи, поэтому, пожалуйста, потерпите меня.

Я создал приложение для реагирования, которое использует экспресс для создания платежных намерений с помощью Stripe. Локально на моей машине приложение работает отлично. Я могу перейти на страницу, которая извлекает метод POST и создает платежное намерение, которое я вижу на панели инструментов Stripe. Однако, когда я загружаю на Heroku, каждый раз, когда я захожу на страницу, я сразу же получаю ошибку 405 Not Allowed для моего метода публикации.

Я заметил, что заголовок ответа был установлен как текстовый/обычный, и попытался изменить его на JSON, используя res.type('json'), однако ошибка по-прежнему показывала, что заголовок ответа был установлен на текстовый/обычный. Я не совсем знаю, в этом ли дело. Любая помощь будет очень признательна.

Снимок экрана с ошибкой Скриншот успеха на моем локальном компьютере

Файл server.js.

const express = require("express");
const app = express();
const { resolve } = require("path");
const path = require('path');
const cors = require('cors')
// This is your real test secret API key.
const stripe = require("stripe")(hidden);

const PORT = process.env.PORT || 4242;

app.use(express.static("."));
app.use(express.json());
app.use(cors());

app.use(express.static(path.join(__dirname, 'build')));

app.get('/*', (req, res) => {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

const calculateOrderAmount = items => {
  let result = items.map(a => a.qty * 1500);
  const reducer = (accumulator, currentValue) => accumulator + currentValue;
  return result.reduce(reducer, 500)
};

app.post("/create-payment-intent", async (req, res) => {
  const { items } = req.body;
  // Create a PaymentIntent with the order amount and currency
  const paymentIntent = await stripe.paymentIntents.create({
    amount: calculateOrderAmount(items),
    currency: "usd",
    payment_method_types: ['card'],
  });
  res.send({
    clientSecret: paymentIntent.client_secret
  });
});

Функция, вызывающая запрос POST внутри моей функции React

useEffect(() => {
    // Create PaymentIntent as soon as the page loads
    window
      .fetch("/create-payment-intent", {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify({items: [{ qty: qty1 }, {qty: qty2}, {qty: qty3}] })  
      })
      .then(res => {
        return res.json();
      })
      .then(data => {
        setClientSecret(data.clientSecret);
      });
  }, [qty1, qty2, qty3]);

Есть ли что-то еще, что мне нужно предоставить, чтобы получить помощь в решении этой проблемы?


person Bryan Rhee    schedule 26.06.2020    source источник
comment
Я думаю, что это может быть проблемой с Heroku. Как именно вы разворачиваетесь в Heroku? Используете ли вы билдпак heroku/static?   -  person Justin Michael    schedule 27.06.2020
comment
Я верю, что я. Вот раздел моего последнего журнала сборки. -----> Build succeeded! =====> Downloading Buildpack: https://github.com/mars/create-react-app-inner-buildpack.git =====> Detected Framework: React.js (create-react-app) Writing static.json` для поддержки приложения create-react-app Включение переменных среды выполнения =====› Загрузка пакета сборки: github.com/heroku/heroku-buildpack-static.git =====› Обнаруженный фреймворк: статический HTML `   -  person Bryan Rhee    schedule 27.06.2020
comment
Я загружаю на github и использую автоматическое развертывание heroku. Думаю, это отвечает на ваши вопросы.   -  person Bryan Rhee    schedule 27.06.2020
comment
Я думаю, что этот комментарий описывает вашу проблему: stackoverflow.com/questions/50970961/ Можете ли вы связаться со службой поддержки Heroku и подтвердить, что это все еще так?   -  person Justin Michael    schedule 27.06.2020
comment
Хммм, ок. Я обратился в службу поддержки Heroku, чтобы узнать, сохраняется ли проблема. Спасибо за помощь Джастину. Я дам вам знать, как это получается.   -  person Bryan Rhee    schedule 28.06.2020
comment
Большое спасибо, Джастин. Проблема заключалась в статическом пакете сборки. Я перенастроил всю страницу, чтобы использовать стандартный пакет узла, и смог заставить почтовый запрос работать!   -  person Bryan Rhee    schedule 28.06.2020
comment
Приятно слышать, что теперь это работает! Я добавил решение как правильный ответ, чтобы его было легко увидеть другим людям, которые найдут этот пост.   -  person Justin Michael    schedule 29.06.2020


Ответы (2)


Проблема здесь в том, что статические пакеты сборки на Heroku разрешают только запросы GET, а не запросы POST. Переход на стандартный пакет узла решает проблему.

person Justin Michael    schedule 29.06.2020

Итак, потратив слишком много времени на это, я решил свою проблему.
Я попробовал способ Жюстин, но не смог ее решить.
Вот что я сделал.
Я использовал приложение mars/create-react-app
Запустить в консоли после входа в систему и создания приложения
heroku buildpacks:set mars/create-react-app -a blogsterapp

https://elements.heroku.com/buildpacks/mars/create-react-app-buildpack
В выше сообщение есть раздел прокси для развертывания, сделайте, как он говорит, - создайте static.json. Это приведет к тому, что любой запрос, имеющий /api в своем запросе в ответ, будет направлен на серверную часть.
Добавьте переменную конфигурации в heroku, и все готово.

person Amit Rawat    schedule 19.07.2020