Мое промежуточное ПО express.js и passport.js все работает и вызывается, но страница не перенаправляет - PullRequest
0 голосов
/ 12 июня 2019

В настоящее время я занимаюсь разработкой узла / экспресс-сервера, и я решил использовать passport-local для аутентификации пользователя вместе с локальным сервером MongoDB. Я использую метод POST из HTML-формы для отправки двух элементов, электронной почты и пароля (я изменил элемент usernameField в моем экземпляре LocalStrategy). Используя console.log, я видел все правильное и ожидаемое поведение от Mongo и Passport. Однако страница никогда не перенаправляется с successRedirect или failRedirect. Похоже, HTML-страница (Login.html) просто обновляется. Интересно, что я получаю различное поведение в зависимости от того, как я решу сделать запрос POST из формы. Первоначально я использовал jQuery и метод $ ('# id'). Submit () для вызова запроса $ .post в '/ Students', и я наблюдал поведение, упомянутое выше. Однако, когда я избавился от этого сценария и использовал его для отправки запроса, промежуточное программное обеспечение не вызывалось (опять же, я подтвердил это с помощью console.log), и страница немедленно перенаправлялась на мой URL-адрес faultRedirect, независимо от того, был ли введен верный данные в форме.

Примечание: «Студент» - это название моей модели мангуста, проблема не в этом

Вещи, которые я уже пробовал: 1. Использование пользовательского обратного вызова с моим passport.authenticate и использование res.redirect. Фактически, я поместил console.log внутри этой функции, чтобы увидеть, была ли она вызвана, и была ли она. Но распаковка res.redirect не сработала. 2. Избавление от моих пользовательских usernameField и passwordField и просто использование по умолчанию. Я наблюдал точно такое же поведение. 3. Использование метода jQuery .click () вместо метода .submit (). Я думал, что отправка формы связана с обновлением страницы, но это не сработало.

Вещи, которые я думаю, могут помочь, но я не знаю, как реализовать: 1. Изменение порядка всех моих серверных Javascript (возможно, что-то вызывается неправильно) 2. Я видел где-то, что passport.authorize использовался вместо passport.authenticate

В app.js

app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
  },
(username, password, done) => {
    console.log(username, password);
    Student.findOne({ email: username, password:password }, function(err, user) {
        console.log(user); //this works as expected
        console.log(!user); //this works as expected
        if (err) { return done(err); }
        if (!user) {
          return done(null, false, { message: 'Incorrect username.' });
        }

        if (user.password != password) {
          return done(null, false, { message: 'Incorrect password.' });
        }

        return done(null, user);
      });
}));

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  Student.findById(id, function(err, user) {
    done(err, user);
  });
});

app.post('/students', passport.authenticate('local', { 
    successRedirect:'/public/Schedule.html',
    failureRedirect:'/' 
}));

В теге сценария Login.html

$('#loginForm').submit(() => {
    let currentUser = {
         email: $('#email').val(),
         password: $('#password').val()
    }

    checkForUser(currentUser);
});

function checkForUser(user) { 
    $.post('http://localhost:9000/students',user, (data) => { 
         console.log(data);
    })
}

1 Ответ

1 голос
/ 12 июня 2019

Ajax-вызов из Javascript на веб-странице не перенаправляет автоматически на основании ответа http.Вещи, которые перенаправляют автоматически, это те вещи, где вызов на сервер происходит не напрямую из Javascript, например, нажатие на ссылку, отправка формы (без Javascript), ввод URL-адреса в строку URL-адреса и т. Д. *

Вместо этого, когда запрос отправляется из Javascript (как кажется, ваш), Javascript возвращает ответ, и этот ответ доступен для вашего Javascript.Если вы видите, что это 302, и вы хотите перенаправить, вы получаете заголовок местоположения и устанавливаете window.location для этого URL перенаправления, чтобы страница перенаправляла.

...