Переадресация промежуточного программного обеспечения Passport.js не работает с AJAX? - PullRequest
0 голосов
/ 31 января 2019

Я отправляю некоторые данные из JS в Node через AJAX и JQuery.Я настроил запрос на публикацию в Node и включил промежуточное ПО для проверки входа пользователя (и перенаправления его на страницу входа, если нет).

Res.redirect ()однако в моем промежуточном программном обеспечении, похоже, не работает мой почтовый запрос AJAX.Я установил другой маршрут GET с промежуточным программным обеспечением, и он работал нормально, просто почему-то не нравится AJAX.Вот мой код:

AJAX POST-запрос от JS:

saveButton.on("click", function() {
   var mealPlan = [];
   var inputText = $(".saveInput").val();
   mealPlan.push(breakfastArr);
   mealPlan.push(lunchArr);
   mealPlan.push(dinnerArr);
   $.ajax({
      method: "POST",
      data: {plan: mealPlan, name: inputText},
      url: "/saverecipe"
   })
   .done(function() {
      console.log("Done");
   })
   .fail(function(err) {
      console.log(err);
   })
});

Маршрут:

app.post("/saverecipe", isLoggedIn, function(req, res) {
    //find the user
    User.findById(req.user._id, function(err, user) {
        if (err) {
            console.log(err);
        } else {
            //create the meal plan
            Plan.create(req.body, function(err, plan) {
                if (err) {
                    console.log(err);
                } else {
                    //push meal plan into user
                    user.mealPlans.push(plan);
                    user.save();
                    console.log("saved.");
                }
            })
        }
    })
});

Промежуточное ПО:

function isLoggedIn(req, res, next) {
    if(req.isAuthenticated()) {
        next();
    } else {
        console.log("Must log in");
        res.redirect("/login");
        req.flash("error", "Please log in first.");
    }
};

Если я 'Я не вошел в систему, кажется, что промежуточное программное обеспечение работает минус бит res.redirect ().Запускается console.log («Must log in») внутри isLoggedIn, а console.log («сохранено») внутри app.post не запускается, указывая на то, что функция не завершена.Единственное, что не работает, это res.redirect ().Не уверен почему.

Любая помощь, которую вы можете оказать, очень ценится.

1 Ответ

0 голосов
/ 31 января 2019

Когда вы используете AJAX.Ответ HTTP должен быть обработан в обратном вызове.Это означает, что вы должны проверить возврат с сервера и самостоятельно выполнить перенаправление.

Вот простой пример того, как AJAX обрабатывает код ответа HTTP перенаправления.

$.ajax({
  method: "POST",
  data: {plan: mealPlan, name: inputText},
  url: "/saverecipe"
})
.done(function(data, textStatus, jqXHR){
  // Get the HTTP Response Code
  let statusCode = jqXHR.status
  // Check if it is equal to 301 
  if( Number(statusCode) === 301 ) {
    // Handle Redirection
    // Retrive Location Header
    let location = jqXHR.getResponseHeader( 'Location' )
    // If Location Header is found. Start Redirection
    if( location ) window.location.replace( location )
  }
  console.log('Done')
})
.fail(function(err){
  console.log(err)
})

Подробнее об использованииAJAX, вы можете обратиться к документации JQuery: http://api.jquery.com/jQuery.ajax/

...