В общем, приложение со стеком Front: React,Redux,Redux-thunk,Typescript,axios Back: Nodejs,MongodbAtlas. Проблема в том, что при отправке POST запроса на сервер, запрос виснет на минуту, потом с сервера приходит либо ошибка 503 server unavailable, либо 500. До того как положил всё это на heroku выдавал 500. Вся фишка в том, что запрос проходит и в конце концов Node заносит данные в базу как полагается, но всё равно отдаёт ошибку.
В то же время GET запрос на /api/users/ проходит и получает пользователей абсолютно адекватно.
Data access layer уровень с axios запросом (здесь вместо localhost должен быть адрес приложения ...com):
import * as axios from 'axios';
const instance = axios.create({
baseURL: 'http://localhost:5000/api/',
});
export const usersAPI = {
getUsers() {
return instance.get('users/').then(res => res.data);
},
addUser(data) {
return instance
.post('users/add', data)
.then(res => console.log(res.data))
.catch(error => console.log(error));
},
};
Actions в которых вызывается запрос до сервера и последующее занесение в редакс:
export const actions = {
setUsers: (users: Array<IUserServerType>) => ({ type: 'SET-USERS', users } as ISetUsersAction),
addUser: (user: IUserServerType) => ({ type: 'ADD-USER', user } as IAddUserAction),
};
export const getUsers = () => async (dispatch: Dispatch<ISetUsersAction>) => {
const users = await usersAPI.getUsers();
dispatch(actions.setUsers(users));
};
Файл app.js - точка входа сервера:
const express = require('express');
const path = require('path');
const config = require('./config');
const mongoose = require('mongoose');
const app = express();
app.use(express.json({ extended: true }));
let userRoutes = require('./routes/users.routes');
app.use('/api/users', userRoutes);
if (process.env.NODE_ENV === 'production') {
app.use('/', express.static(path.join(__dirname, 'client', 'build')));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
}
const PORT = config.PORT || 5000;
async function start() {
try {
await mongoose.connect(config.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
});
app.listen(PORT, () => console.log(`App has been started on port ${PORT}!`));
} catch (e) {
console.log('Server error', e.message);
process.exit(1);
}
}
start();
Обрабатывающий роутер:
const { Router } = require('express');
const { check, validationResult } = require('express-validator');
const User = require('../models/User');
const router = Router();
router.post(
'/add',
[
check('first_name').notEmpty(),
check('last_name').notEmpty(),
check('email', 'Некорректный email').isEmail(),
],
async (req, res) => {
try {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array(),
message: 'Данные введены некорректно',
});
}
const { first_name, last_name, email } = req.body;
const user = new User({ first_name, last_name, email });
await user.save();
res.status(201);
} catch (e) {
res.status(500).json({ message: 'Что-то пошло не так, попробуйте снова' });
}
},
);
router.get('/', async (req, res) => {
try {
const users = await User.find({});
res.json(users);
} catch (e) {
res.status(500).json({ message: 'Что-то пошло не так, попробуйте снова' });
}
});
module.exports = router;
вот ссылка на гитхаб, если так будет удобнее:
https://github.com/NextLint/test