res.sendFile() 未发送文件(无错误)

res.sendFile() not sending file (no errors)

我有一个使用 passport.js 的简单登录页面。

 $("#loginUser").on("click", function () {   //login button handler
            var User = {
                username: $('#username').val().trim().toLowerCase(),
                password: $("#password").val().trim()
            };
            //$("#password").val("");
            $.post("/login", User);
        });

“/login”的 post 路由代码如下(取自护照文档):

app.post('/login', function (req, res, next) {
        passport.authenticate('local', function (err, user) {
            if (err) { return next(err); }
            if (!user) { return res.redirect('/'); }
            req.logIn(user, function (err) {
                if (err) { return next(err); }
                return res.redirect('/home/' + user.user_id);
            });
        })(req, res, next);
    });

下面是 "home" 路线的代码:

  app.get("/home/:user?", function (req, res) { //home page
    console.log(req.params.user)
    if (req.user) {
      console.log(path.join(__dirname, "../public/home.html"))
      res.sendFile(path.join(__dirname, "../public/home.html"), (err) => {
        if (err) {
          console.log(err);
        } else {
          console.log('file sent!');
        }
      });
    }
    else {
      console.log("no user");
      res.sendFile(path.join(__dirname, "../public/login.html"));
    }
  });

我遇到的问题是当页面应该重定向到主页时,它什么也没做。 console.log("file sent") 将无错误触发,即使没有任何反应并且页面停留在登录屏幕上。但是,如果我实际输入 localhost://8080/home,页面将加载得很好。

这不是您的服务器未发送文件的问题 - 这是您的网页未正确重定向的问题。

Ajax 您正在使用此代码的调用:

$.post("/login", User);

不自动重定向。他们所做的只是 return 对您的 Ajax 完成处理程序 Javascript 的 302 响应(您没有任何代码)。因此,您的请求被传送到服务器。您的服务器发送 302 重定向响应,该 302 响应返回到您的 Javascript 并被您的 Javascript 丢弃在地板上。

只有放在浏览器栏中的 URL 或用户点击的 URL 或 browser-only 表单 posts(不是从 Javascript 完成的)将自动重定向。 Ajax 呼叫不会自动重定向 - 它们只是将重定向状态和位置传送回您的 Javascript,然后您的 Javascript 必须处理它才能执行任何操作。

您有两个选择要修复:

  1. 切换到没有 Javascript 的普通浏览器表单 post,然后浏览器本身将看到并遵循重定向。

  2. 为您的 Ajax 调用使用完成处理程序,检查状态,如果是 3xx 响应,则获取位置 header 并将 window.location = xxx 设置为header 中导致重定向发生的位置。

我还没有对此进行测试,但这是检查状态并根据 3xx 状态手动重定向的一般概念。

$.post("/login", User).then((data, textStatus, jqXHR ) => {
    if (jqXHR.status >= 300 && jqXHR.status <= 399) {
       window.location = jqXHR.getResponseHeader("Location");
    } else {
       console.log("not a redirect status of:", jqXHR.status);
    }
});