我正在通过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()。不知道为什么。
非常感谢您能提供的任何帮助。
答案 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/