2016-12-10 2 views
1

Я создаю приложение корзины покупок в nodejs/expressjs. У меня возникли проблемы с перенаправлением на правильную страницу после входа пользователя. Я нашел несколько статей, которые тесно связаны, но все мои попытки исправить это из данных статей не делают трюк.Как правильно перенаправить в NodeJS/ExpressJS?

access: function(req, res){ 
    var data = JSON.parse(req.body.data); 
    console.log(data); 
     Customers.findOne({"custEmail": data.custEmail}, function(err, user){ 
     if(err){ 
      console.log(err); 
      res.send("error"); 
     }if(!user){ 
      console.log("user not found"); 
      res.send("error"); 
     }else{ 
      console.log("user found"); 
      bcrypt.compare(data.custPassword, user.custPassword, function(err, reponse){ 
      if(reponse){ 
       req.session.regenerate(function(err){ 
       if(err){ 
        console.log(err); 
        res.send("error"); 
       }else{ 
        req.session.success = true; 
        res.send("Success"); 
        //res.redirect('/'); 
       } 
       }); 
      }else{ 
       console.log("error"); 
      } 
      }); 
      } 
     }); 

Что происходит, пользователь вводит свою регистрационную информацию и нажимает кнопку входа в систему. Запрос Ajax отправляет данные этой функции доступа. Функция начинается с проверки, существует ли пользователь в базе данных. Если он делает, чем он продолжает сравнивать пароль bcrypt, если они равны, они успешно авторизуются и если они не равны, то, очевидно, это ошибки.

Вопрос, кажется, здесь: }else{ req.session.success = true; res.send("Success"); //res.redirect('/'); }

Когда электронная почта пользователя и пароль соответствуют этим ударил прямо здесь. Он говорит: установите для этого сеанса значение true, чтобы пользователь мог получить доступ к страницам, где требуется этот сеанс, а затем отправляет сообщение «Успешное» обратно на запрос ajax. В настоящее время это работает отлично, и res.send отправляется на передний план. Когда я раскомментирую res.redirect, произойдет ожидаемый результат «невозможно установить заголовки после их установки». Поэтому, когда я комментирую res.send, res.redirect просто не работает вообще. Никакой ошибки, никакого нарушения ничего просто просто ничего.

Мне любопытно, почему этот перенаправление здесь не работает? Заголовки не устанавливаются нигде в этой функции, и ожидаемым результатом должно быть то, что перенаправление будет работать отлично. Любая помощь приветствуется. Благодарю.

ответ

6

Когда вы отправляете вызов ajax и получаете ответ, браузер не делает ничего с текущей страницей в браузере на основе этого ответа ajax. Таким образом, не имеет значения, отправляете ли вы ответ перенаправления на вызов ajax или нет. Браузер не изменит текущую страницу в браузере, несмотря ни на что. Ответы Ajax генерируют данные для вашего Javascript, и ваш Javascript должен решить, что с ним делать.

FYI, браузер изменит текущую страницу только в том случае, если переадресация происходит из запроса страницы браузера или отправленного сообщения в браузере (не представленный Javascript). Поскольку вы не регистрируетесь, вы не можете использовать перенаправление для изменения текущей страницы браузера.

Итак, если вы собираетесь использовать вызов ajax на клиенте для входа в систему, и вы хотите, чтобы клиент изменил страницы после успешного входа в систему Ajax, вы, вероятно, захотите отправить URL-адрес перенаправления в ответ на вход и клиент обрабатывает его и устанавливает window.location, чтобы сделать переадресацию при входе в систему.

Например, вы могли бы изменить:

res.send("Success"); 

к этому:

res.json({status: "Success", redirect: '/'}); 

И, затем код клиента проверить возврат из вызова Ajax и если состояние будет успешным, его может захватить свойство редиректа и сделать что-то вроде:

if (ajaxResult.status === "Success") { 
    window.location = ajaxResult.redirect; 
} 

Мне любопытно, почему это перенаправление здесь не сработает? Заголовки не установлены нигде в этой функции, и ожидаемый результат должен состоять в том, что перенаправление будет работать отлично. Любая помощь: очень ценится.

Сообщение о заголовках уже отправлено, что весь ответ уже отправлен с res.send("Success");, и теперь вы пытаетесь отправить другой ответ. Вы получаете только один ответ на данный запрос. После того, как вы сделали res.send("Success");, объект http-сервера отправил весь ответ и затем закрыл этот ответ. Вы не можете отправить больше данных в этот момент.

+0

HEY THANK YOU. Для меня было достаточно первого первого resposne. Я закончил тем, что просто удалил запрос Ajax, потому что он не был на 100% необходимым. Мне просто нравится, как работает Ajax, поэтому я бы использовал его здесь. Вместо этого я достал Ajax и просто схватил req.body.data со страницы при отправке формы. Тогда было так же просто, как разместить правильную переадресацию. Цените свой своевременный и чрезвычайно полезный ответ! – Zgbrell

+0

Я не хочу изменять или удалять что-либо из вашего ответа .. если вы хотите смело отнести это утверждение: перенаправления обычно не применяются к вызовам ajax, потому что браузер не обрабатывает их при вызове ajax (браузер обрабатывает перенаправления на странице загрузка или ответ на сообщение формы). в вашем ответе было бы отлично. Это предложение само по себе помогло мне решить просто не использовать Ajax в этом конкретном случае. – Zgbrell

+0

Вы тоже посмотрите на это сообщение? [Ссылка] (http://stackoverflow.com/questions/41089118/how-to-make-a-successful-ajax-request-using-javascript-on-page-load) – Zgbrell

Смежные вопросы