Req.user потерян между POST и GET - PullRequest
0 голосов
/ 27 марта 2020

Я новичок в Node и начинаю с демонстрации Rocket Rides . Регистрация пилота работает в веб-приложении, и я хочу сделать то же самое для пассажиров в Интернете (в то время как в демоверсии есть регистрация пассажиров на iOS). Я не могу понять, почему req.user поддерживается с исходным кодом для пилотов, а не с моей адаптацией для пассажиров.

Я добавил console.log() в GET server/routes/pilots/pilots.js:

/**
 * GET /pilots/signup
 *
 * Display the signup form on the right step depending on the current completion.
 */
router.get('/signup', (req, res) => {
  let step = 'account';
  console.log("*** Req.user = " + req.user);
  // ...
});

и в POST:

/**
 * POST /pilots/signup
 *
 * Create a user and update profile information during the pilot onboarding process.
 */
router.post('/signup', async (req, res, next) => {
  const body = Object.assign({}, req.body, {
    // Use `type` instead of `pilot-type` for saving to the DB.
    type: req.body['pilot-type'],
    'pilot-type': undefined,
  });

  // Check if we have a logged-in pilot
  let pilot = req.user;
  if (!pilot) {
    try {
      // Try to create and save a new pilot
      pilot = new Pilot(body);
      pilot = await pilot.save()
      // Sign in and redirect to continue the signup process
      req.logIn(pilot, err => {
        if (err) next(err);
        console.log("About to redirect with:");
        console.log(pilot);
        return res.redirect('/pilots/signup');
      });
    } catch (err) {
      // Show an error message to the user
      const errors = Object.keys(err.errors).map(field => err.errors[field].message);
      res.render('pilot-signup', { step: 'account', error: errors[0] });
    }
  } 
  else {
    // ...
  }
});

Код для пассажиров аналогичен, и я включаю его внизу. Журналы сервера для регистрации пилота показывают:

*** Req.user = undefined
GET /pilots/signup 200 136.726 ms - 1865
GET /stylesheets/rocketrides.css 304 0.911 ms - -
GET /javascripts/rocketrides.js 304 1.043 ms - -
GET /images/header.jpg 304 5.187 ms - -
GET /images/rocketrides.svg 304 10.075 ms - -
About to redirect with:
{
  rocket: { country: 'US' },
  type: 'individual',
  country: 'US',
  _id: 5e7e24d38794fa32032fd052,
  email: 'name@example.com',
  password: '...',
  created: 2020-03-27T16:07:47.054Z,
  __v: 0
}
POST /pilots/signup 302 116.113 ms - 72
*** Req.user = {
  rocket: { country: 'US' },
  type: 'individual',
  country: 'US',
  _id: 5e7e24d38794fa32032fd052,
  email: 'name@example.com',
  password: '...',
  created: 2020-03-27T16:07:47.054Z,
  __v: 0
}
GET /pilots/signup 200 93.455 ms - 6018

Журналы регистрации пассажиров, которые я настроил, показывают:

*** Req.user = undefined
GET /passengers/signup 200 165.900 ms - 1869
GET /stylesheets/rocketrides.css 304 2.573 ms - -
GET /javascripts/rocketrides.js 304 1.161 ms - -
GET /images/header.jpg 304 4.349 ms - -
GET /images/rocketrides.svg 304 4.423 ms - -
About to redirect with:
{
  rocket: { country: 'US' },
  type: 'individual',
  _id: 5e7e259d8794fa32032fd053,
  email: 'name@example.com',
  password: '...',
  created: 2020-03-27T16:11:09.273Z,
  __v: 0
}
POST /passengers/signup 302 32.873 ms - 80
*** Req.user = undefined
GET /passengers/signup 200 137.442 ms - 1869

В обоих случаях req.user запускается с undefined пользователь (пассажир или пилот) сохраняется в базе данных, и код перенаправляется в GET с допустимым объектом. У пилотов этот объект получен по запросу GET, но не для пассажиров.

Приложение уже использует сеанс состояния в app.js и работает для одного типа регистрации, поэтому мой вопрос отличается от эта тема . Это может быть что-то очевидное для большинства и закопано в коде для новичка ie. Я также включил passport.serializeUser() из pilots.js в passengers.js.

Как я могу исправить проблему или отладить ее?

extras

Код для GET server/routes/passengers/passengers.js:

/**
 * GET /passengers/signup
 *
 * Display the signup form on the right step depending on the current completion.
 */
router.get('/signup', (req, res) => {
  let step = 'account';
  console.log("*** Req.user = " + req.user);
  // ...
});

Код для POST в том же файле:

/**
 * POST /passengers/signup
 *
 * Create a user and update profile information during the passenger onboarding process.
 */
router.post('/signup', async (req, res, next) => {
  const body = Object.assign({}, req.body, {
    // Use `type` instead of `passenger-type` for saving to the DB.
    type: req.body['passenger-type'],
    'passenger-type': undefined,
  });

  // Check if we have a logged-in passenger
  let passenger = req.user;
  if (!passenger) {
    try {
      // Try to create and save a new passenger
      passenger = new Passenger(body);
      passenger = await passenger.save()

      // Sign in and redirect to continue the signup process
      req.logIn(passenger, err => {
        if (err) next(err);
        console.log("About to redirect with:");
        console.log(passenger);
        return res.redirect('/passengers/signup');
      });
    } catch (err) {
      // Show an error message to the user
      const errors = Object.keys(err.errors).map(field => err.errors[field].message);
      res.render('passenger-signup', { step: 'account', error: errors[0] });
    }
  } 
  else {
    // ...
  }
});

1 Ответ

0 голосов
/ 27 марта 2020

Я не понимал стратегию Passport, а пассажирский пассажир сериализовался и десериализовался как пилот. Действительна только первая функция passport.serialize(); когда я сначала импортировал passengers.js, пилоты сериализовались и десериализовались как пассажиры.

См. этот пост о том, как работает паспорт (указано в Passport JS serializeUser и выполнении deserializeUser flow ) и в этом выпуске Github о том, как обрабатывать несколько локальных стратегий с помощью одной сериализации и десериализации.

В моем случае я буду использовать класс user для пассажиров и пилоты наследуют от.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...