#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/
это или это перенаправление? Кроме того, вы проверили, правильно ли установлена переменная envREACT_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, но по какой-то причине не смог найти его даже при входе в систему. на данный момент я удалил его, и он работает нормально.