Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72

Запуск БД React + Node

18.02.2024, 14:31. Показов 613. Ответов 7

Студворк — интернет-сервис помощи студентам
Пытаюсь понять, как можно запустить БД в React приложении. Использую СУБД MySQL. В последней версии приложения получаю ошибки:
Ошибка при отправке данных на сервер: Request failed with status code 404
Код прилагаю. файл server.js, в котором реализуется подключение к БД, получение всех данных с клиента и запись в таблицу:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Импортируем необходимые зависимости
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const cors = require('cors');
 
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '************',
  database: 'wtf_db'
});
 
 
connection.connect((err) => {
  if (err) {
    console.error('Ошибка подключения к базе данных:', err);
    throw err;
}
console.log('Подключение к базе данных успешно установлено');
});
 
// Создаем экземпляр express
const app = express();
 
// Используем middleware для обработки JSON данных
app.use(bodyParser.json());
//app.use(cors());
// Определяем маршрут для обработки POST запросов
app.post("/api/addData", (req, res) => {
// Получаем данные из тела запроса
const { title, link, pic, text } = req.body;
 
// Выполняем операции с базой данных 
const sql = `INSERT INTO past_orders_info (Header, link, photo, description) VALUES (?, ?, ?, 
?)`;
connection.query(sql, [title, link, pic, text], (err, result) => {
if (err) {
  console.error('Ошибка выполнения SQL запроса:', err);
  res.status(500).send('Ошибка сервера');
  return;
}
console.log('Данные успешно добавлены в базу данных');
res.status(200).send('Данные успешно добавлены в базу данных');
});
});
 
// Устанавливаем порт, на котором будет работать сервер
const port = process.env.PORT || 3000;
 
// Запускаем сервер на выбранном порту
app.listen(port, () => {
  console.log(`Сервер запущен на порту ${port}`);
});
Файл Form.js, в котором идет инициализация всех полей, данные которых затем записываются в БД:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import Modal from "./Modal/Modal";
import { useInput } from "../hooks/use-form-validate";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faPersonCircleCheck } from "@fortawesome/free-solid-svg-icons";
import DragDropFile from "./DragNDrop/DragDrop.js";
import axios from "axios";
 
const sign = <FontAwesomeIcon icon={faPersonCircleCheck} size="2x" marginRight="10px" />;
 
function Form() {
  const [modalActive, setModalActive] = useState(false);
 
  const handleSubmit = async (event) => {
    event.preventDefault();
    try {
      // Отправляем POST-запрос на сервер с данными формы
      const response = await axios.post("/api/addData", {
        title: title.value,
        link: link.value,
        pic: pic.value,
        text: text.value
      });
 
      if (response.status === 200) {
        console.log("Данные успешно отправлены на сервер");
        setModalActive(true);
      } else {
        console.error("Ошибка при отправке данных на сервер:", response.statusText);
      }
    } catch (error) {
      console.error("Ошибка при отправке данных на сервер:", error.message);
    }
  };
 
  // form validation
  const { t } = useTranslation();
  const title = useInput("", { isEmpty: true, minLength: 5 });
  const link = useInput("", { isEmpty: true, minLength: 2 });
  const pic = useInput("", { isEmpty: true, minLength: 1 });
  const text = useInput("", { isEmpty: true, minLength: 2 });
 
  return (
    <form className="contact__form" onSubmit={handleSubmit}>
      <div className="input__data">
        <input
          onBlur={title.onBlur}
          value={title.value}
          onChange={title.onChange}
          className="name__input input form__control element-animation"
          type="text"
          placeholder={t("post.title")}
          name="title"
          required
        />
        {title.isDirty && title.isEmpty && <div className="form__error">{t("error.empty")}</div>}
        {title.isDirty && title.minLengthError && (
          <div className="form__error">{t("error.length")}</div>
        )}
      </div>
 
      <div className="input__data">
        <input
          onBlur={link.onBlur}
          value={link.value}
          onChange={link.onChange}
          className="link__input input form__control element-animation"
          type="text"
          placeholder={t("post.link")}
          name="link"
          required
        />
        {link.isDirty && link.isEmpty && <div className="form__error">{t("error.empty")}</div>}
        {link.isDirty && link.minLengthError && (
          <div className="form__error">{t("error.length")}</div>
        )}
      </div>
 
      <DragDropFile />
 
      <div className="input__data">
        <textarea
          onBlur={text.onBlur}
          value={text.value}
          onChange={text.onChange}
          className="form__textarea form__control element-animation"
          name="text"
          id="text"
          placeholder={t("post.text")}
        ></textarea>
        {text.isDirty && text.isEmpty && <div className="form__error">{t("error.empty")}</div>}
        {text.isDirty && text.minLengthError && (
          <div className="form__error">{t("error.length")}</div>
        )}
      </div>
 
      <button
        disabled={!title.inputValid || !link.inputValid || !text.inputValid}
        className="form__btn form__control element-animation"
        type="submit"
        name="submit"
      >
        {t("post.button")}
      </button>
      <Modal active={modalActive} setActive={setModalActive}>
         {sign}
         <p>{t("contact.modalThanks")}</p>
        <br />
        <p>{t("contact.modalRequest")}</p>
      </Modal>
    </form>
  );
}
 
export default Form;
Также проверил с помощью консольной команды, может ли адрес осуществлять POST-запросы, на что получил ответ "Cannot POST /api/addData", но что делать дальше не знаю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2024, 14:31
Ответы с готовыми решениями:

Запуск готового проекта на node js+react
Разархивировал данный проект из гитхаба у себя: https://github.com/bhaskarteched/MusicApp Затем открываю консоль в данном проекте и...

Интернет магазин node js + react
Доброго времени суток. Сейчас я стою в самом начале создания проекта интернет магазина с использованием React + Node js. При исследовании...

Корзина товаров на Node + React Redux
Добрый день. Я новичок в Node. Есть следующая проблема: Нужно реализовать POST при нажатии на кнопку &quot;Добавить в корзину&quot;. API...

7
 Аватар для voraa
1259 / 1221 / 180
Регистрация: 21.01.2024
Сообщений: 5,630
18.02.2024, 17:03
А страница, которая делает запрос на сервер, тоже с 3000 порта приходит?
Вы же указываете относительный адрес /api/addData. Он относительно страницы. Если страница с другого порта пришла, то и запрос пошлет на свой порт.
Смотрите в Devtools во вкладке сеть, куда обращение идет.
0
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72
18.02.2024, 17:08  [ТС]
voraa Абсолютно с того же самого
0
 Аватар для voraa
1259 / 1221 / 180
Регистрация: 21.01.2024
Сообщений: 5,630
18.02.2024, 17:46
Цитата Сообщение от Devilion123 Посмотреть сообщение
voraa Абсолютно с того же самого
Этот же сервер, который на 3000 порту и страницу отдает?

Добавлено через 34 минуты
А если страница приходит с другого сервера (другие протоколы, хост, порт), то даже указав абсолютный адрес при обращении к серверу, вы получите ошибку CORS.
Что бы избавиться от нее, ваш сервер должен посылать заголовок
Code
1
Access-Control-Allow-Origin: *
0
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72
18.02.2024, 21:44  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
Что бы избавиться от нее, ваш сервер должен посылать заголовок
Получается, что мне надо работать с CORS'ом напрямую?

Просто версия кода с ним тоже ничего особо не меняет.

Попробовал заглянуть в DevTools и получил следующее:
Миниатюры
Запуск БД React + Node  
0
 Аватар для voraa
1259 / 1221 / 180
Регистрация: 21.01.2024
Сообщений: 5,630
18.02.2024, 21:57
Еще раз.
С какого сервера браузер получает страницу?

У вас есть файл server.js, который реализует сервер на node, для обращения к БД.
Вы к нему обращаетесь, что бы получить страницу?
Или есть еще какой то сервер, который работает на 3000 порту.

Просто не могут два сервера работать на одном порту. Когда приходит запрос, как им определиться, к кому именно этот запрос пришел.
Я не знаю, как на node (просто не пробовал) но не удается запустить на одном хосте и на одном порту два сервера, написанных на го. При запуске второго, получаешь отлуп, что уже есть программа, которая привязана к этому порту на этом хосте.
0
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72
18.02.2024, 22:04  [ТС]
voraa, Больше никаких серверов нет. Я могу отправить ссылку на GH репозиторий, если так будет проще разобраться во всей это каше
0
 Аватар для voraa
1259 / 1221 / 180
Регистрация: 21.01.2024
Сообщений: 5,630
18.02.2024, 22:36
Вот сейчас попробовал на node запустить два сервера на одном хосте и порту. При запуске второго получаю ошибку
Code
1
Error: listen EADDRINUSE: address already in use 192.168.50.10:8000
Добавлено через 1 минуту
Цитата Сообщение от Devilion123 Посмотреть сообщение
Больше никаких серверов нет.
А кто вам посылает страницу?

Ну дайте ссылку.

Вот что вы делаете.
Запускаете сервер, типа
>node script.js
Открываете браузер, вводите в адресную строку
localhost:3000
и получаете страницу?

Добавлено через 27 минут
Не ничего не понял.
и server.js не запускается, по естественным причинам - у меня не стоит mysql
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2024, 22:36
Помогаю со студенческими работами здесь

Node-react-mysql приложение не работает на heroku
Здравствуйте! Мое приложение не открывается на heroku (см. скрины), но нормально открывается на локальном хосте. Если кто понимает из-за...

Передача данных c сервера Node.js в App.js (react приложение) через proxy
Здравствуйте, уважаемые форумчане! У меня следующий вопрос. Я, кажется, не до конца понимаю механизм передачи данных с сервера Node.js в...

Запуск приложения через NODE.js
Добрый день! Хочу попробовать Javascript немножко с другой стороны, и позапускать приложения через NODE.JS. Сам NODE консоль для windows...

Запуск файла в Windows 10 с node.js
Здравствуйте! Я совсем недавно поставил node.js, чтобы запускать файлы с расширением .mp3 у себя в системе. Как в javascript называется...

NW.js - node webkit/ Запуск .EXE файлов windows
Пытаюсь выполнить открытие файлов .EXE на node webkit (он же NW.js) Вот так, работает. &lt;button id=&quot;run&quot;&gt;open...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru