Запрос на вставку MySQL выполнен успешно, но не вставляется в таблицу базы данных

Я работаю над страницей регистрации React/MySQL. Запрос на вставку выполняется, но не вставляется в таблицу базы данных. Я не уверен, почему.

В внутренней папке у меня есть файл server.js:

const express = require("express");
const mysql = require("mysql");
const cors = require("cors");

const app = express();
app.use(cors());
app.use(express.json());

const db = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "",
  database: "my_db",
});

app.post("/signup", (req, res) => {
  const sql = "INSERT INTO login (`name`, `email`, `password`) VALUES (?)";
  const values = [req.body.name, req.body.email, req.body.password];
  db.query(sql, [values], (err, data) => {
    if (err) return res.json(err);
    return res.json(data);
  });
});

app.listen(8081, () => {
  console.info("Listening...");
});    

В моей папке внешнего интерфейса есть App.js, который выглядит следующим образом:

import React from "react";
import SignUp from "./SignUp";

function App() {
  return <SignUp></SignUp>;
}

export default App;

И затем мой файл SignUp.js:

import React, { useState } from "react";
import axios from "axios";

function SignUp() {
  const [values, setValues] = useState({
    name: "",
    email: "",
    password: "",
  });
  const handleChangeEvent = (event) => {
    setValues({ ...values, [event.target.name]: [event.target.value] });
  };
  const handleSubmit = (event) => {
    event.preventDefault();
    axios
      .post("http://localhost:8081/signup", values)
      .then((res) => console.info("Registered Successfully"))
      .catch((err) => console.info(err));
  };

  return (
    <form onSubmit = {handleSubmit}>
      <input
          type = "text"
          placeholder = "Enter Name"
          name = "name"
          className = "form-control rounded-0"
          onChange = {handleChangeEvent}
        />
      // 2 more inputs for email and password
    </form>
  );
}

export default SignUp;

NPM start используется для запуска бэкэнда и внешнего интерфейса.

Я использую сервер MAMP, на котором работает phpMyAdmin на локальном хосте: 8888.

Форма запущена и работает, и когда я ввожу имя, адрес электронной почты и пароль, на консоли появляется сообщение «Зарегистрировано успешно», но после обновления базы данных никакие записи не были вставлены.

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

Что я сделал не так и как это исправить?

Редактировать

Я внес следующие изменения в server.js, как предложили Фил и МатБейли. в комментариях ниже:

app.post("/signup", (req, res) => {
  const sql =
    "INSERT INTO login (`name`, `email`, `password`) VALUES (?, ?, ?)";
  const values = [req.body.name, req.body.email, 
req.body.password];
  db.query(sql, values, (err, data) => {
    // if (err) return res.json(err);
    // return res.json(data);
    if (err) {
      console.error("Error in signup", err);
      return res.sendStatus(500);
    }
  });
});

Я получаю следующую ошибку Axios в консоли:

POST http://localhost:8081/signup 500 (Internal Server Error)

На вкладке сети я вижу это:

Редактировать 2

Раздел ответа на ошибку Axios гласит следующее:

«на консоли написано «Успешно зарегистрирована»»… это потому, что вы возвращаете любые ошибки как 200 Success. Измените свой серверный код, чтобы использовать if (err) return res.status(500).send(err). Я бы также посоветовал регистрировать любые ошибки в вашем серверном коде, чтобы вы могли о них знать.

Phil 01.07.2024 03:03

Вы также можете использовать панель «Сеть» инструментов разработчика вашего браузера, чтобы проверить фактический текст ответа.

Phil 01.07.2024 03:05

@Phil - я вернул ошибку 500, ту же самую, которую я опубликовал в ответе Одри ниже.

John Beasley 01.07.2024 03:10

Пожалуйста, отредактируйте свой вопрос, чтобы предоставить подробную информацию об отладке. Как уже упоминалось, вы можете проверить фактическое тело ответа в своих инструментах разработки. В идеале вы должны регистрировать ошибки на сервере, а не раскрывать подробности клиенту... if (err) { console.error('Error in signup', err); return res.sendStatus(500); }

Phil 01.07.2024 03:23

Используйте (?,?,?) вместо (?), а затем используйте values вместо [values].

MatBailie 01.07.2024 03:25

Наконец, НЕ храните пароли в виде простого текста в своей БД. Используйте метод проверки хеширования, например bcrypt

Phil 01.07.2024 03:37

@Phil - я внес в вопрос «ценности». И да, как только я смогу сохранить данные в дБ, я буду хэшировать пароли.

John Beasley 01.07.2024 03:38

Кажется, вам не хватает каких-либо подробностей об ошибке. Просто в целях отладки измените его на return res.status(500).send(err) и на панели инструментов разработчика выберите запрос, а затем вкладку Response. Что это говорит?

Phil 01.07.2024 03:43

@Phil - у меня нет вкладки ответа в инспекторе. Я предполагаю, что вы имеете в виду ошибку Axios. Я отредактировал вопрос и предоставил скриншот ответа.

John Beasley 01.07.2024 03:47

Видите первый скриншот, на котором есть вкладки «Заголовки», «Полезная нагрузка», «Предварительный просмотр», «Ответ», «Инициатор» и «Время»?

Phil 01.07.2024 03:49
ECONNREFUSED, похоже, проблема в этом. Node.js не может подключиться к вашему серверу MySQL. Вы уверены, что он работает и учетные данные верны?
Phil 01.07.2024 03:50

Вероятно, дубликат ошибки mysql node.js: ECONNREFUSED

Phil 01.07.2024 03:55

@Phil - я использую MAMP, а phpmyadmin находится на локальном порту 8888. React работает на порту 3000, а App.js прослушивает порт 8081. Может ли быть что-то с этим? Это расстраивает.

John Beasley 01.07.2024 03:56

Какой у вас порт MySQL? Вы можете проверить это, запустив этот запрос в своем phpmyadmin SHOW VARIABLES LIKE 'port';

FanoFN 01.07.2024 10:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
14
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

попробуй это

const sql = "INSERT INTO login (`name`, `email`, `password`) VALUES (?, ?, ?)";

или

const sql = "INSERT INTO login SET ?";
db.query(sql, request.body, (err, data) => {
   if (err) return res.json(err);
   return res.json(data);
});

Тестирование........

John Beasley 01.07.2024 03:00

Не повезло ни тому, ни другому. В первом примере запрос был успешно выполнен, но в базе данных ничего не сохранилось. Второй пример привел к аксиальной ошибке.

John Beasley 01.07.2024 03:06

Хотя метод SET ? удобен, я бы не стал слепо использовать его request.body, по крайней мере, без проверки.

Phil 01.07.2024 03:31
Ответ принят как подходящий

Оказывается, моей проблемой был сервер MAMP. После перехода на XAMPP мне удалось записать данные формы в базу данных.

На самом деле это не ответ, который поможет другим читателям. Два упомянутых вами продукта делают по существу одно и то же, и оба будут запускать предоставленный вами код (если они настроены правильно). Настоящая ошибка, скорее всего, связана с проблемой на стороне сервера (например, необработанное исключение) или, возможно, указывает на неправильный локальный порт (см. предложенный Филом дубликат ошибки ECONNREFUSED).

halfer 08.07.2024 23:23

Другие вопросы по теме

Использование ключевого слова TABLE для ВЫБРАТЬ все из и SELECT * из table_name
MySQL JSON_OBJECTAGG — Как исправить ошибку «PDOException: SQLSTATE[22032]: <>: 3158 JSON-документы могут не содержать NULL-имена элементов»?
Измените строку из одного столбца перед вставкой в ​​другой
Выполнение различных функций агрегирования для разных строк выходных данных, возвращаемых предложением group by
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ НА ДВУХ ТАБЛИЦАХ MYSQL С 3 СВЯЗАННЫМИ КОЛОННАМИ
SQL SELECT * FROM table WHERE Столбец NOT LIKE '%str%' не работает, я чувствую себя глупо
MySQL – получение неправильного результата при попытке получить случайный результат из большой таблицы
Как выбрать отдельные элементы из таблицы по переменной, а затем присоединиться к другой таблице в LINQ
Есть ли способ проверить совокупный способ получить месяц на основе полей суммы
Подсчет повторяющихся шаблонов символов в строке с использованием MySQL