Экспресс-вход в REST API переходит прямо к ошибке 401

У меня есть этот контроллер для маршрута входа, проблема только в том, что он не работает... Вчера работал, ничего не менял и сейчас не работает. Он просто проваливается в блок 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
            });
        });
}

Кроме того, вот фото ошибки: Экспресс-вход в REST API переходит прямо к ошибке 401

Вы пытались отладить его и выяснить, где возникает ошибка?

incorelabs 09.02.2019 01:17

@incorelabs Да, я ничего не смог найти, только то, что он попадает в блок catch

Garrett 09.02.2019 01:23

Изображение i.stack.imgur.com/s6wyS.png показывает, что сервер отвечает ошибкой 401 и что сообщение об ошибке от сервера — «Ответ об ошибке HTTP для локальный: 8080/API/аутентификация/логин: 401 Неавторизованный». Таким образом, похоже, что вам нужно выяснить, что заставляет сервер считать запрос неавторизованным. Вы, вероятно, захотите проверить журналы сервера, чтобы увидеть, какие дополнительные сведения сервер регистрирует на стороне сервера, прежде чем он ответит этим 401.

sideshowbarker 10.02.2019 06:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
387
1

Ответы 1

Поскольку информации о том, что не так, очень мало, я просто попытаюсь предложить другой подход к отладке:

Вы проверили, что входит в req.body?

И вы уверены, что это не соответствует заявлению catch? Потому что, если это так, объект ошибки не должен быть пустым.

Мой совет, чтобы отказаться от этой возможности, состоит в том, чтобы изменить сообщения об ошибках, которые вы выдаете, на что-то более репрезентативное для блока, из которого они выбрасываются. Например, cannot find that userId при первой отправке res.status(401).

Еще один совет — фактически изменить коды состояния, чтобы лучше передавать тип возникающей ошибки. Запрет в основном относится к ошибкам на стороне клиента - например, попытка доступа к защищенному маршруту без действительного токена.

Например:

  if (!user) {
    res.status(404).json({
      message: 'Couldn\'t find the username provided.'
     });
    }

Надеюсь отзыв был полезен!

Другие вопросы по теме