【问题标题】:Passport.js middleware redirect not working with AJAX?Passport.js 中间件重定向不适用于 AJAX?
【发布时间】:2019-06-24 09:57:30
【问题描述】:

我通过 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("Must log in")运行,app.post里面的console.log("saved.")没有运行,说明函数没有完成。唯一不起作用的是 res.redirect()。不知道为什么。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2017-08-28
      相关资源
      最近更新 更多