Почему 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 шт):
Как я понимаю, никакой 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 только к тем объектам, для которых вы устанавливаете маршруты напрямую
Если всё норм с моделью, которая подключена так const User = require('../models/User') то правильно или .save от документа, или .create от модели.
1 вариант
const user = new User({
email
});
await user.save();
2 вариант (возможно не точно, пишу по памяти)
await User.create({
email
});
