Passport.js中间件重定向不能与AJAX一起使用?

时间:2019-01-31 01:35:18

标签: jquery node.js ajax express passport.js

我正在通过AJAX和JQuery从JS向Node发送一些数据。我已经在Node中设置了发布请求,并且提供了一个中间件来检查用户是否已登录(如果没有登录,请重新路由至登录页面)。

但是,中间件中的res.redirect()似乎不适用于我的AJAX发布请求。我使用中间件设置了另一条GET路由,它运行良好,只是出于某种原因它不喜欢AJAX。这是我的代码:

来自JS的AJAX POST请求:

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()位。 isLoggedIn中的console.log(“必须登录”)运行,而app.post中的console.log(“ saved。”)未运行,表明该功能未完成。唯一不起作用的是res.redirect()。不知道为什么。

非常感谢您能提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

使用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/