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;

Ответы (0 шт):