Почему POST запрос возвращает ошибку 500?

Есть роутер, и при попытке сделать на него POST запрос возвращается ошибка 500.

Я понимаю, что обрабатывается блок catch, но не понимаю почему. В чем моя ошибка?

const { Router } = require('express');
const User = require('../models/User');
const config = require('config');
const cors = require('cors');
const bodyParser = require('body-parser');

const router = Router();

const jsonParser = bodyParser.json();

const corsOptions = {
    origin: config.get('CORS.whiteList' ),
    optionsSuccessStatus: config.get('CORS.optionsSuccessStatus')
}

router.post('/login',
    cors(corsOptions),
    jsonParser,
    async(req, res) => {
        try {
            const email = req.body.email;
            console.log(email)
            const candidate = await User.findOne({ email: email });
            if (isEmpty(email)) {
                console.log(3)
                return res.status(400).json({
                    msg: 'Некоректные данные при регистрации'
                });
            }

            if (candidate) {
                return res.status(400).json({
                    msg: 'Такой email уже зарегестрирован'
                });
            }

            const user = new User({
                email
            });

            await user.create();

        } catch (err) {
            console.log(3)
            res.status(500).json({
                msg: 'Что-то пошло не так, попробуйте снова'
            });
        }

        function isEmpty(str) {
            return (!str || 0 === str.length);
        }
    }
);

module.exports = router;

введите сюда описание изображения


UPD

Во время деббагинга я обнаружил, что проблема в этих строках:

const user = new User({
    email
});

await user.create();

Здесь я создаю поле в mongoDB.

Почему-то user.create is not a function. С моделью все в порядке.


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

Автор решения: DiD

Как я понимаю, никакой catch не срабатывает. А express ругается, что вместо процедуры ему суют промис.

Коллеги с зарубержного сообщества дали хороший ответ. Я любезно его переведу для вас.

Существуют два решения в виде модулей: express-promise-router и express-asyncify

express-promise-router

const router = require('express-promise-router')();

// Дальше использовать как обычный роутер с асинхронными функциями `async functions`.

express-asyncify

const asyncify = require('express-asyncify');

// Чтобы починить маршруты в объекте `app`
// замените `const app = express();` на
const app = asyncify(express());

// Чтобы починить маршруты в объекте `router`
// замените `const router = Router();` на
const router = asyncify(Router());

Вам нужно применить функцию asyncify только к тем объектам, для которых вы устанавливаете маршруты напрямую

https://www.npmjs.com/package/express-asyncify

→ Ссылка
Автор решения: nörbörnën

Если всё норм с моделью, которая подключена так const User = require('../models/User') то правильно или .save от документа, или .create от модели.

1 вариант

const user = new User({
  email
});

await user.save();

2 вариант (возможно не точно, пишу по памяти)

await User.create({
  email
});
→ Ссылка