ProGatti
@ProGatti
Fullstack-разработчик

Axios post запрос на сервер node js проходит и заносит данные в базу, но обваливается с 503 ошибкой, что делать?

В общем, приложение со стеком 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
  • Вопрос задан
  • 1440 просмотров
Решения вопроса 1
Вместо
res.status(201);

надо сделать
res.status(201).end();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы