Я работаю над страницей регистрации 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)
На вкладке сети я вижу это:
Раздел ответа на ошибку Axios гласит следующее:
Вы также можете использовать панель «Сеть» инструментов разработчика вашего браузера, чтобы проверить фактический текст ответа.
@Phil - я вернул ошибку 500, ту же самую, которую я опубликовал в ответе Одри ниже.
Пожалуйста, отредактируйте свой вопрос, чтобы предоставить подробную информацию об отладке. Как уже упоминалось, вы можете проверить фактическое тело ответа в своих инструментах разработки. В идеале вы должны регистрировать ошибки на сервере, а не раскрывать подробности клиенту... if (err) { console.error('Error in signup', err); return res.sendStatus(500); }
Используйте (?,?,?)
вместо (?)
, а затем используйте values
вместо [values]
.
Наконец, НЕ храните пароли в виде простого текста в своей БД. Используйте метод проверки хеширования, например bcrypt
@Phil - я внес в вопрос «ценности». И да, как только я смогу сохранить данные в дБ, я буду хэшировать пароли.
Кажется, вам не хватает каких-либо подробностей об ошибке. Просто в целях отладки измените его на return res.status(500).send(err)
и на панели инструментов разработчика выберите запрос, а затем вкладку Response
. Что это говорит?
@Phil - у меня нет вкладки ответа в инспекторе. Я предполагаю, что вы имеете в виду ошибку Axios. Я отредактировал вопрос и предоставил скриншот ответа.
Видите первый скриншот, на котором есть вкладки «Заголовки», «Полезная нагрузка», «Предварительный просмотр», «Ответ», «Инициатор» и «Время»?
ECONNREFUSED
, похоже, проблема в этом. Node.js не может подключиться к вашему серверу MySQL. Вы уверены, что он работает и учетные данные верны?
Вероятно, дубликат ошибки mysql node.js: ECONNREFUSED
@Phil - я использую MAMP, а phpmyadmin находится на локальном порту 8888. React работает на порту 3000, а App.js прослушивает порт 8081. Может ли быть что-то с этим? Это расстраивает.
Какой у вас порт MySQL? Вы можете проверить это, запустив этот запрос в своем phpmyadmin SHOW VARIABLES LIKE 'port';
попробуй это
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);
});
Тестирование........
Не повезло ни тому, ни другому. В первом примере запрос был успешно выполнен, но в базе данных ничего не сохранилось. Второй пример привел к аксиальной ошибке.
Хотя метод SET ?
удобен, я бы не стал слепо использовать его request.body
, по крайней мере, без проверки.
Оказывается, моей проблемой был сервер MAMP. После перехода на XAMPP мне удалось записать данные формы в базу данных.
На самом деле это не ответ, который поможет другим читателям. Два упомянутых вами продукта делают по существу одно и то же, и оба будут запускать предоставленный вами код (если они настроены правильно). Настоящая ошибка, скорее всего, связана с проблемой на стороне сервера (например, необработанное исключение) или, возможно, указывает на неправильный локальный порт (см. предложенный Филом дубликат ошибки ECONNREFUSED).
«на консоли написано «Успешно зарегистрирована»»… это потому, что вы возвращаете любые ошибки как
200 Success
. Измените свой серверный код, чтобы использоватьif (err) return res.status(500).send(err)
. Я бы также посоветовал регистрировать любые ошибки в вашем серверном коде, чтобы вы могли о них знать.