У меня есть этот контроллер для маршрута входа, проблема только в том, что он не работает... Вчера работал, ничего не менял и сейчас не работает. Он просто проваливается в блок catch и выдает ошибки, однако на самом деле у него нет ошибки, и я не совсем уверен, куда идти дальше.
Вот мой app.js
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const systemRoutes = require('./routes/system');
const recipeRoutes = require('./routes/recipes');
const authRoutes = require('./routes/auth');
const app = express();
app.use(bodyParser.json());
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*'); // Change later to only allow our server
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
next();
});
app.use('/api/system', systemRoutes);
app.use('/api/feed', recipeRoutes);
app.use('/api/auth', authRoutes);
// TODO: Add error handling and validation
mongoose.connect('mongodb://localhost:27017/learn')
.then(result => {
app.listen(8080);
})
.catch(err => {
console.error(err);
});
Вот мой контроллер:
exports.login = (req, res, next) => {
let fetchedUser;
User.findOne({ username: req.body.username })
.then(user => {
if (!user) {
return res.status(401).json({
message: 'Auth failed'
});
}
fetchedUser = user;
return bcrypt.compare(req.body.password, user.password);
})
.then(result => {
if (!result) {
return res.status(401).json({
message: 'Auth failed'
});
}
// TODO: Replace "secret_sauce" with secret key
const token = jwt.sign(
{ username: fetchedUser.username, userId: fetchedUser._id },
'secret_sauce',
{ expiresIn: '30d' }
);
res.status(200).json({
token: token,
userId: fetchedUser._id
});
})
.catch(err => {
return res.status(401).json({
message: 'Error trying to login',
error: err
});
});
}
@incorelabs Да, я ничего не смог найти, только то, что он попадает в блок catch
Изображение i.stack.imgur.com/s6wyS.png показывает, что сервер отвечает ошибкой 401 и что сообщение об ошибке от сервера — «Ответ об ошибке HTTP для локальный: 8080/API/аутентификация/логин: 401 Неавторизованный». Таким образом, похоже, что вам нужно выяснить, что заставляет сервер считать запрос неавторизованным. Вы, вероятно, захотите проверить журналы сервера, чтобы увидеть, какие дополнительные сведения сервер регистрирует на стороне сервера, прежде чем он ответит этим 401.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку информации о том, что не так, очень мало, я просто попытаюсь предложить другой подход к отладке:
Вы проверили, что входит в req.body?
И вы уверены, что это не соответствует заявлению catch? Потому что, если это так, объект ошибки не должен быть пустым.
Мой совет, чтобы отказаться от этой возможности, состоит в том, чтобы изменить сообщения об ошибках, которые вы выдаете, на что-то более репрезентативное для блока, из которого они выбрасываются. Например, cannot find that userId при первой отправке res.status(401).
Еще один совет — фактически изменить коды состояния, чтобы лучше передавать тип возникающей ошибки. Запрет в основном относится к ошибкам на стороне клиента - например, попытка доступа к защищенному маршруту без действительного токена.
Например:
if (!user) {
res.status(404).json({
message: 'Couldn\'t find the username provided.'
});
}
Надеюсь отзыв был полезен!
Вы пытались отладить его и выяснить, где возникает ошибка?