Node + MySQL + React. Ошибка 500 при POST запросе
Создаю проект авторизации на Fullstack (мой первый, раньше только front). Очень много проблем с соединением с MySQL возникает в процессе разработки. Одна из них - ошибка сервера при POST запросе. При дебаге идет ошибка в месте запроса в кастомном хуке, хотя все данные приходят правильно. Значит, где-то не так подключил БД. Код основного файла по back-end (app.js):
const express = require('express')
const config = require('config')
const mysql = require('mysql2')
const app = express()
app.use(express.json({ extended: true }))
app.use('/api/auth', require('./routes/auth.routes'))
const PORT = config.get('port') || 5000
const con = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "fullstack",
})
async function start() {
try {
con.connect(err => {
if (err) {
console.log(err.message)
}
else {
console.log("Database ------- OK")
}
})
app.listen(PORT, () => console.log(`App has been started on port ${PORT}...`))
} catch (e) {
console.log('Server error', e.message)
process.exit(1);
}
}
start()
Код модели (models/User.js):
const config = {
username: "root",
password: "root",
database: "fullstack",
host: "localhost",
dialect: "mysql"
}
const Sequelize = require("sequelize")
const sequelize = new Sequelize(config)
sequelize.define("User", {
email: { type: Sequelize.STRING, required: true, unique: true },
password: { type: Sequelize.STRING, required: true }
})
И код кастомного хука, через который я это соединяю:
import { useCallback, useState } from "react"
export const useHttp = () => {
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
const request = useCallback(async (url, method = 'GET', body = null, headers = {}) => {
setLoading(true)
try {
if (body) {
body = JSON.stringify(body);
headers['Content-Type'] = 'application/json';
}
const response = await fetch(url, { method, body, headers })
const data = await response.json()
if (!response.ok) {
throw new Error(data.message || 'Что-то пошло не так')
}
setLoading(false)
return data
}
catch (e) {
setLoading(false)
setError(e.message)
throw e
}
}, [])
const clearError = useCallback(() => setError(null), [])
return {loading, request, error, clearError}
}
Код роутов:
const { Router } = require('express')
const bcrypt = require('bcryptjs')
const config = require('config')
const jwt = require('jsonwebtoken')
const {check, validationResult} = require('express-validator')
const User = require('../models/User')
const router = Router()
// Подготовка эндпоинтов для дальнейшей работы
router.post(
'/register',
[
check('email', 'Некорректный email').isEmail(),
check('password', 'Минимальное длина пароля 6 символов').isLength({min:6})
],
async (req, res) => {
try {
const errors = validationResult(req)
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array(),
message: "Некорретные данные при регистрации"
})
}
const { email, password } = req.body
const candidate = await User.findOne({ email })
if (candidate) {
return res.status(400).json({message: "Такой пользователь уже существует"})
}
const hashedPassword = await bcrypt.hash(password, 12)
const user = new User({ email, password: hashedPassword })
await user.save()
res.status(201).json({message: 'Пользователь создан'})
} catch (e) {
res.status(500).json({ message: 'Что-то пошло не так, попробуйте снова'})
}
})
router.post('/login',
[
check('email', 'Введите корректный email').normalizeEmail().isEmail(),
check('password', 'Введите пароль').exists()
],
async (req, res) => {
try {
const errors = validationResult(req)
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array(),
message: "Некорретные данные при входе в систему"
})
}
const { email, password } = req.body
const user = await User.findOne({ email })
if (!user) {
return res.status(400).json({message: "Пользователь не найден"})
}
const isMatch = await bcrypt.compare(password, user.password)
if (!isMatch) {
return res.status(400).json({message: 'Неверный пароль, попробуйте снова'})
}
const token = jwt.sign(
{
userId: user.id
},
config.get('jwtSecret'),
{expiresIn: '1h'}
)
res.json({ token, userId: user.id})
} catch (e) {
res.status(500).json({ message: 'Что-то пошло не так, попробуйте снова'})
}
})
module.exports = router;