Как перенаправить в Nodejs/Expressjs после входа пользователя?

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

/*-----------Login and register using email and password------------------- */ 

const register = async (req, res) => {
  const user = await User.create({...req.body });
  try{
    const token = user.createJWT();
    res.status(StatusCodes.CREATED).json({ user: { name: user.name}, token });
    const { name } = user;
    res.redirect(`api/v1/user/${user.name}/dashboard`)

  } catch (error) {
    res.status(500).json({
      success: false,
      error: error.message,
    });
  }
};



const login = async (req, res) => {
  const { email, password } = req.body;
  if (!email || !password) {
    throw new BadRequestError("Please provide an email and password");
  }

  try {
    const user = await User.findOne({ email }).select("+password");

    

    if (!user) {
      return res.status(StatusCodes.UNAUTHORIZED).json(" Invalid credentials ");
    }
    const isMatch = await user.matchPassword(password);
    if (!isMatch) {
      throw new UnauthenticatedError("Invalid credentials");
    }
    const token = user.createJWT();
    res.status(StatusCodes.OK).json({ user: {name: user.name}, token});

    const { name } = user;

    res.redirect(`api/v1/user/${name}/dashboard`)

  } catch (error) {
    res.status(500).json({
      success: false,
      error: error.message,
    });
  }
};
/*-----------Login and register using email and password------------------- */ 

при использовании отправки и отправки запроса на /auth/login или /auth/register он продолжает выдавать ошибку:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Мне любопытно, почему этот редирект здесь не работает?

Это не работает, так как вы уже установили заголовки и отправили объект JSON с помощью метода .json(). В принципе, вы не можете отправить объект и перенаправить страницу одновременно. Вы можете сохранить свой токен в каком-либо хранилище, а затем отправить его с помощью метода перенаправления, если это необходимо.

felmez 10.04.2023 01:11

Вы отправляете ОК, что означает 200, затем перенаправляете, что обычно 302. Каковы ваши ожидания в любом случае?

felmez 10.04.2023 01:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что json() и redirect() оба отправляют ответ. И в то время как вы можете технически добиться того, что ищете, установив заголовки и тело ответа вручную, а затем отправив его:

 .get('/test', (req, res) => {
        const jsonData = JSON.stringify({ data: 41 })
        res.statusCode = 200
        res.setHeader('Location', '/otherPage');
        res.setHeader('Content-Type', 'application/json');
        res.setHeader('Content-Length', Buffer.byteLength(jsonData));
        res.write(jsonData);
        res.end()
    })

Перенаправление, вероятно, заставит ответ HTTP вернуть HTML-содержимое или данные /otherPage. Кроме того, перенаправление обычно имеет код состояния 3XX и делает перенаправление со статусом 200, что вводит в заблуждение и определенно не является лучшей практикой.

Лучше отправить ответ JSON с данными и добавить redirectPath, который затем можно обработать в клиенте.

res
    .status(200)
    .json({ user: { name: user.name }, token, redirectPath: `api/v1/user/${user.name}/dashboard` })

Другие вопросы по теме