Ошибка 404 ОТПРАВКИ данных формы из react в express

#javascript #node.js #reactjs #express

#javascript #node.js #reactjs #экспресс

Вопрос:

Я пытаюсь отправить данные из формы (react) в свой серверный сервер (nodejs / express), но я получаю ошибку 404. Здесь много кода, поэтому я попытался опубликовать только то, что важно.

Функция для отправки

   //submit data
  const submitCard = (ev) => {
    console.log(ev);
    ev.preventDefault();

    try {
      api.post('/api/stripe/', payment).then((result) => {
        window.location.href = process.env.REACT_APP_REDIRECT_URI;
      });
    } catch (e) {
      console.log(e);
    }
  };

 

отправляемые данные

   const paymentUpdated = () => {
    setPayment({
      name: name,
      firstName: firstName,
      lastName: lastName,
      cardNumber: number,
      expDate: expiry,
      cvc: cvc,
      zip: zip,
      plan: plan,
    });
  };
 

тег формы кнопка

 <form className="creditForm" onSubmit={submitCard}>
<Button className="save-button" type="submit">
 

отправляется маршрут (все еще требуется отправить данные в stripe)

  app.post('/api/stripe', requireLogin, async (req, res) => {
    const plan = await stripe.plans.retrieve('price_1HfAZGGFN31Q4RRjSrFXnGgD');
    console.log(req);
    if (req.user.stripeId) {
      const customer = await stripe.customers.retrieve(req.user.stripeId);
    } else {
      const customer = await stripe.customers.create({
        email: req.user.email,
        description: 'Subscribing to Personal Plan Monthly Subscription',
      });
      req.user.stripeId = customer.id;
      const user = await req.user.save();
    }
    req.user.plan = 2;
    const user = await req.user.save();
    const subscription = await stripe.subscriptions.create({
      customer: req.user.stripeId,
      items: [{ price: 'price_1HfAZGGFN31Q4RRjSrFXnGgD' }],
    });
 

Комментарии:

1. Можете ли вы определить, не выполняется ли запрос на /api/stripe/ это или это перенаправление? Кроме того, вы проверили, правильно ли установлена переменная env REACT_APP_REDIRECT_URI ?

2. /api/stripe/ терпит неудачу, когда я запускаю его сам по себе, потому что ему нужны данные из формы для отправки, чтобы stripe мог их обработать, но все еще выполняется, пока не дойдет до этой точки. Когда я отправляю форму, она вообще не запускается на стороне сервера, поэтому я подумал, что это как-то связано с функцией, которую я использовал для публикации. Ошибка 404, которую я получаю, имеет правильный порт ‘localhost: 3500/api/ stripe/, который является маршрутом к express/ nodejs

3. Меня смущает первый фрагмент. На первый взгляд это кажется интерфейсным кодом, но затем вы используете process.env, который глобально доступен в node. Также вы никогда не используете то, что возвращается вашим обещанием. Я предполагаю, что это окно. Расположение. для href задается URL-адрес, у которого нет маршрута, и это потенциально является причиной 404

4. Все первые 3 фрагмента были кодом из компонента формы внешнего интерфейса. Я не знал, что process.env предназначен только для узла. Я также использую его с react и вызываю это перенаправление в нескольких других местах на сайте. Возможно, вы правы, хотя сейчас я тестирую серверный маршрут с помощью curl и получаю другую ошибку (401), поэтому после того, как я решу это, я попробую еще раз без результатов или process.env

Ответ №1:

Похоже, что существует несоответствие в URL-адресе, на который вы отправляете, и в том, который настроен в express. Ваша публикация в /api/stripe/ , но express настроен для прослушивания /api/stripe , обратите внимание на отсутствие завершающего / элемента в express. Таким образом, он не находит ожидаемую конечную точку.

Я обычно тестирую свои API-интерфейсы с помощью curl команд, например

 curl -X POST "http://localhost:3500/api/stripe/" -H  "content-type: application/json" -d '{"key1": "value1", "key2": "value 2"}'
 

Как только я докажу, что API работает, только тогда я буду беспокоиться о вызове его из приложения. Это облегчит определение того, в чем заключается проблема в вашем коде.

Комментарии:

1. Да, это выглядит правильно. Убедитесь, что ваша конечная точка API сначала работает с запросами curl вручную или postman / insomnia, а затем встроите ее в свое приложение. Вероятно, удаление лишнего / в вашем запросе api.post('/api/stripe', ...) исправит вашу проблему.

2. Не думал об этом, но я думаю, что это помогло мне решить проблему. Это было с помощью функции requireLogin, которую я использовал, чтобы убедиться, что пользователь вошел в систему перед публикацией. Он ссылался на req.user, но по какой-то причине не смог найти его даже при входе в систему. на данный момент я удалил его, и он работает нормально.