res.sendFile () не отправляет файл (без ошибок) - PullRequest
0 голосов
/ 27 мая 2020

У меня простая страница входа по паспорту. 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» (взят из паспортных документов):

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);
    });

Ниже приведен код для «домашнего» маршрута:

  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, страница загрузится отлично.

1 Ответ

0 голосов
/ 27 мая 2020

Дело не в том, что ваш сервер не отправляет файл - дело в том, что ваша веб-страница не перенаправляется должным образом.

Ajax вызовов, которые вы используете с этим кодом:

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

не перенаправлять автоматически. Все, что они делают, это возвращают ответ 302 вашему Ajax обработчику завершения Javascript (для которого у вас нет кода). Итак, ваш запрос доставлен на сервер. Ваш сервер отправляет ответ перенаправления 302, этот ответ 302 возвращается на ваш Javascript и падает на пол вашим Javascript.

Только URL-адреса, помещенные в панель браузера, или URL-адреса, на которые щелкнул пользователь или сообщения формы только для браузера (не из Javascript) будут перенаправлены автоматически. Вызовы Ajax не перенаправляются автоматически - они просто доставляют статус перенаправления и местоположение обратно в ваш Javascript, где ваш Javascript должен затем обработать его, чтобы что-то сделать.

У вас есть пара варианты исправления:

  1. Переключитесь на обычную публикацию в браузере без Javascript, и тогда браузер сам увидит перенаправление и выполнит его.

  2. Используйте обработчик завершения для своего вызова Ajax, проверьте статус и, если это ответ 3xx, затем получите заголовок Location и установите window.location = xxx на место в этом заголовке, чтобы вызвать перенаправление.

Я не тестировал это, но вот общая концепция проверки статуса и ручного перенаправления на основе статуса 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);
    }
});
...