Express маршрутизатор отправляет HTML заголовки вместо JSON с использованием Passport. js - PullRequest
1 голос
/ 12 апреля 2020

У меня есть API router.post, который отправляет неправильные заголовки, мне нужно, чтобы заголовки были установлены на application/json; charset=utf-8, но они отправляют как text/html; charset=utf-8, поэтому я продолжаю получать 400 error. Как я могу убедиться, что они отправляют как JSON правильно, чтобы я мог обработать POST и необходимые ошибки?

Маршрутизатор

const express = require('express');
const router = express.Router();
const User = require('../models/user');
const passport = require('passport');

router.post('/signup', (req, res, next) => {
    User.register(new User({
        username: req.body.username,
        email: req.body.email
    }),
    req.body.password, (err, user) => {
        if (err) {
            res.statusCode = 500;
            res.setHeader('Content-Type', 'application/json');
            res.json({
                err: err
            });
        } else {
            passport.authenticate('local')(req, res, () => {
                User.findOne({
                    username: req.body.username
                }, (err, person) => {
                    res.statusCode = 200;
                    res.setHeader('Content-Type', 'application/json');
                    res.json({
                        success: true,
                        status: 'Registration Successful!',
                    });
                });
            })
        }
    })
});

router.post('/login', passport.authenticate('local'), (req, res) => {
    User.findOne({
        username: req.body.username
    }, (err, person) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json({
            success: true,
            status: 'You are successfully logged in!'
        });
    })
});

router.get('/logout', (req, res, next) => {
    if (req.session) {
        req.logout();
        req.session.destroy((err) => {
            if (err) {
                console.log(err);
            } else {
                res.clearCookie('session-id');
                res.json({
                    message: 'You are successfully logged out!'
                });
            }
        });
    } else {
        var err = new Error('You are not logged in!');
        err.status = 403;
        next(err);
    }
});

Приложение. js

const express = require('express');
const path = require('path');
const bodyParser = require("body-parser");
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const usersRouter = require('./routes/users');

const app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// Middleware
app.use(bodyParser.json());
app.use(express.urlencoded({ extended: false }));
app.use(passport.initialize());
app.use(session({
    name: '...',
    secret: '...',
    saveUninitialized: false,
    resave: false
}));
app.use(passport.initialize());
app.use(passport.session());

//Passport
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.use('/', indexRouter);
app.use('/users', usersRouter);

1 Ответ

1 голос
/ 12 апреля 2020

У меня есть API router.post, который отправляет неправильные заголовки, мне нужно, чтобы заголовки были установлены в application / json; charset = utf-8, однако они отправляются как text / html; charset = utf-8, поэтому я продолжаю получать ошибку 400. Как я могу убедиться, что они отправляют как JSON правильно, чтобы я мог обработать POST и необходимые ошибки?

Ошибка 400, очевидно, исходит от промежуточного программного обеспечения паспорта:

passport.authenticate('local', { failWithError: true })

в вашем определении маршрута:

router.post('/login', passport.authenticate('local'), (req, res) => {

Вам нужно будет проверить код вашей локальной стратегии. По определению passport.authenticate('local') ожидает очень специфический c тип входящих данных. Если он не находит эти данные, он приходит к выводу, что это неверный запрос.

, если req.body.username пусто, то возвращаемая ошибка - Bad Request 400

Вы можете либо добавить свое промежуточное программное обеспечение до промежуточного программного обеспечения паспорта для проверки работоспособности req.body.username и отправить обратно желаемую ошибку, либо, возможно, вы можете настроить свою локальную стратегию для возврата желаемой ошибки.


Это также кажется Скорее всего, вы ищете пользователя в базе данных в своей локальной стратегии паспорта, а затем в своем маршруте, вы ищете его снова. Вы не должны это делать. Вы должны настроить и использовать паспорт для аутентификации, отклонения запроса или передачи ошибки в собственный код обработки ошибок. Вам не нужно проверять, что паспорт выполнил свою работу, снова выполнив поиск пользователя.

...