У меня проблемы с сайтом, созданным с помощью Express.
Вот как это должно работать:
- Пользователь регистрируется, и сервер сохраняет пользователя в базе данных mongoose
- Пользователю назначается токен JWT, который отправляется браузеру в заголовке ответа.
- Браузер берет заголовок и сохраняет его в локальном хранилище, чтобы использовать с последующими запросами.
- Затем пользователь перенаправляется на страницу своего профиля. Это достигается путем отправки еще одного AJAX-запроса при успешном обратном вызове первого запроса.
Моя проблема в том, что страница профиля не отображается, когда я вызываю res.render () в маршруте POST / loggedin , и я не уверен, почему, поскольку консоль регистрируется непосредственно перед res.render () работают, показывая, что запрос AJAX выполнен.
Вот серверные маршруты:
//homepage
app.get("/", (req, res) => {
res.render("home.hbs");
});
//signup
app.post("/signup", urlencodedParser, (req, res, next) => {
let body = _.pick(req.body, ['studentid', 'name', 'password', 'department']);
let user = new User(body);
user.save().then(() => {
return user.generateAuthToken();
}).then((token) => {
res.header({'x-auth': token, studentid: req.body.studentid}).send(user);
}).catch((err) => {
res.status(400).send(err);
})
})
//go to profile
app.post("/loggedin", authenticate, (req, res) => {
console.log(`token: ${req.header('x-auth')}`)
console.log(`name from database: ${req.user.name}`)
res.render(`loggedIn.hbs`);
})
Вот javascript внешнего интерфейса, который срабатывает, когда пользователь отправляет форму:
$.ajax({
url: "/signup",
method: "POST",
data: {
name: name,
studentid: studentid,
department: department,
password: password,
},
success: function (response, textStatus, xhr) {
let auth = xhr.getResponseHeader('x-auth');
let id = xhr.getResponseHeader('studentid');
localStorage.setItem('x-auth', auth);
localStorage.setItem('studentid', id);
// redirect to loggedin pages
$.ajax({
url: "/loggedin",
type: "POST",
beforeSend: function(xhr){xhr.setRequestHeader('x-auth', auth);}, // send token with request
success: function(page) {
console.log('redirecting');
},
fail: function() {
alert('Cannot log in, please try again later')
}
});
},
error: function (response, textStatus, xhr) {
if(response.status == 400) {
if(response.responseJSON.errmsg && response.responseJSON.errmsg.includes("E11000 duplicate key error collection")) {
return alert("There is already a user with the same student id in the database.")
}
alert("Sign up failed, please try again later.")
}
}
});
Любой совет будет принята с благодарностью