Я новичок в 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 {
// ...
}
});