файл res.sendFile прерывается, отправляя меня на локальный хост:XXXX/?

#javascript #node.js #express #express-session

Вопрос:

У меня есть настроенный маршрут, к которому осуществляется доступ, как я знаю из консоли.журналы. Однако файл res.sendFile в конце не переносит его в нужное место. Он отправляет меня на локальный хост:XXXX/?.

Это и есть маршрут:

 router.get('/bidder', async (req, res) => {
  console.log('GET /bidder')
  console.log(req.session.user_id)
  
  try {
    const userData = await User.findByPk(req.session.user_id, {
      attributes: { exclude: ['password'] },
      include: [
        { 
          model: Project,
          attributes: ['project_name'],
          through: Bid,
          as: 'project_users'
        }
      ],
    });

    console.log(path.join(__dirname, '/../public', '/bidder.html'))
    res.sendFile(path.join(__dirname, '/../public', '/bidder.html',), function (err) {
      if (err) {
        console.log(err)
      }
    })
  } catch (err) {
    console.log(err)
    res.status(500).json(err);
  }
});
 

И это маршрут, который приведет меня к маршруту /участник торгов выше:

 router.post('/login', async (req, res) => {
  console.log('POST /login');
  try {
      const user = await User.findOne({ where: { email: req.body.email } });

      if (!user) {
          res
              .status(400)
              .json({ message: 'Incorrect email or password, please try again.' });
          return;
      }

      const validPassword = await user.checkPassword(req.body.password);

      if (!validPassword) {
          res
              .status(400)
              .json({ message: 'Incorrect email or password, please try again.' });
          return;
      }

      req.session.save(() => {
        console.log(user);
        console.log(user.id);
        console.log(user.is_poster);
        
        req.session.user_id = user.id;
        req.session.is_poster = user.is_poster;
        req.session.logged_in = true;
        
        console.log(req.session.logged_in)
        
        if (req.session.is_poster == false) {
          console.log('---------------------------')
          console.log(req.session.is_poster)
          console.log(path.join(__dirname, '/../public/bidder.html'))
          
          res.redirect('/bidder')
        } else if (req.session.is_poster == true) {
          console.log('---------------------------')
          console.log(req.session.is_poster)
          console.log(path.join(__dirname, '/../public/poster.html'))
          
          res.redirect('/poster')
        } else {
          console.log('not logged in')
          
          res.redirect('/')
        }
      });

  } catch (err) {
    console.log(err);
    res.status(404).end();
  }
});
 

The error that it is logging is:

 Error: Request aborted
    at onaborted (C:UserscamerDesktophomeworkproject-bid-boardnode_modulesexpresslibresponse.js:1025:15)
    at Immediate._onImmediate (C:UserscamerDesktophomeworkproject-bid-boardnode_modulesexpresslibresponse.js:1067:9)
    at processImmediate (internal/timers.js:464:21) {
  code: 'ECONNABORTED'
}
 

Если я просто наберу localhost:XXXX/участник торгов в браузере, он отправит меня на правильную html-страницу, как и должно быть.

ИЗМЕНИТЬ Это JS, связанный с отправкой данных для входа в систему:

 $('#login-button').on('click', function(event) {
    event.preventDefault();
    
    var email = $('#login-email').val()
    var password = $('#login-password').val()

    loginUser(email, password)
})

const loginUser = async (email, password) => {
    const response = await fetch (`/api/user/login`, {
        method: 'POST',
        body: JSON.stringify({ email, password }),
        headers: { 'Content-Type': 'application/json' },
    })

    console.log(response.statusText)
}
 

И это та форма, с которой он работает:

                   <form>
                    <div>
                        <label for="username">E-mail / Username:</label>
                        <input class="text-input" id="login-email" type="text" placeholder="me@example.com" />
                    </div>
                    <div>
                        <label for="password">Password:</label>
                        <input class="text-input" type="text" id="login-password" placeholder="password"></input>
                    </div>
                    <section>
                        <button class="btn-lg btn-block" id="login-button">Login</button>
                        <div class="text-center" id="signupSuccessMsg"></div>
                    </section>
                </form>
 

Комментарии:

1. Отправляете ли вы /login маршрут из вызова Ajax в своем Javascript? Я спрашиваю, потому что вызовы Ajax ПО умолчанию НЕ следуют за перенаправлениями. Они не изменяют то, что отображается в браузере, если вы не напишете для этого свой собственный Javascript.

2. @jfriend00 Я не такой.

3. Где же /login тогда запускается маршрут? Чем?

4. Возможно ли, что req.session.save() есть ошибка, для которой у вас нет обработчика ошибок?

5. Каковы журналы /login маршрута до того, как вы получите сообщение об ошибке?

Ответ №1:

Вы размещаете команду /login with fetch() в своем Javascript. fetch() само по себе ЭТО НИЧЕГО НЕ меняет в окне браузера — даже если ответом будет перенаправление.

Вместо fetch() этого делает http-запрос на ваш сервер, получает ответ и отправляет его на ваш Javascript. Это полностью зависит от вашего Javascript, чтобы решить, что делать с этим ответом. Если вы хотите следовать перенаправлению, вам нужно написать свой Javascript, чтобы найти статус ответа 3xx от fetch() вызова, получить location заголовок и затем установить window.location этот новый URL. Это приведет к тому, что браузер перейдет на эту новую страницу.


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

Комментарии:

1. Добавление window.location = response.url после выборки в JS решило проблему. Спасибо вам за помощь.