Для req.user не задано значение res.locals в app.use в узле экспресс-паспорта js

Я новичок в nodejs, я пытаюсь разработать веб-сайт с двумя пользователями, обычным пользователем и фрилансером. Когда пользователь регистрируется в res.locals.currentUser в качестве req.user с помощью middleware app.use (я использую одно и то же промежуточное ПО для обоих типов пользователей).

app.use(session({
secret: "Rusty is the best and cutest dog in the world",
resave: false,
saveUninitialized: false,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
cookie: { maxAge: 180 * 60 *1000 }
}));

Мой код app.use

app.use(passport.initialize());
app.use(passport.session());

app.use(function(req, res, next){
console.log("inside app use");
res.locals.currentUser = req.user;
res.locals.session = req.session;
console.log(req.user);
next();
});

Когда пользователь logsin req.user показывает нужного пользователя, но когда фрилансер logsin req.user здесь в app.use не определен.

Моя паспортная конфигурация для пользователя

passport.use('user', new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

Моя конфигурация паспорта для администратора

passport.use('freelancer', new LocalStrategy(Freelancer.authenticate()));
passport.serializeUser(Freelancer.serializeUser());
passport.deserializeUser(Freelancer.deserializeUser());

Логин пользователя, который работает нормально

app.post("/user-login", passport.authenticate("user", {

failureRedirect: "/user-login"
}) ,function(req, res){
console.log("success");
if(req.session.oldUrl){
    var oldUrl = req.session.oldUrl;
    req.session.oldUrl = null;
    res.redirect(oldUrl);

}else{
    console.log("inside else");
    res.redirect("/my-user-profile/"+req.user._id);
}
});

Проблема с другим типом пользователя Фрилансер. Мой маршрут входа в систему фрилансера

app.post("/freelancer-login", passport.authenticate("freelancer", {
failureRedirect: "/freelancer-login"
}) ,function(req, res){
res.locals.currentUser = req.user;
res.locals.session = req.session;
console.log("currentUser ------>");
console.log(res.locals.currentUser);
res.redirect("f-profile/"+req.user._id);
});

на моем console.log(res.locals.currentUser); Я получаю правильную информацию о пользователе, а также req.user показывает правильную информацию внутри этого маршрута, но когда я пытаюсь получить доступ к currentUser в других представлениях ejs, currentUser не определен только для фрилансера. Текущий пользователь в app.use также показывает undefined (только для фрилансера).

Я застрял в этом в течение длительного времени, и любая помощь была бы спасением

Заранее спасибо:-)

2 ответа

Радж, это может быть проблема или заказ вашего кода.

app.use(function(req, res, next){
  res.locals.currentUser = req.user;
  });
  
  

Должно быть сверху вашего кода. Попробуй это!

Только что решил это для себя:

Мне пришлось изменить метод десериализации на:

      passport.deserializeUser(async function (id, done) {
  try {
    const user = await User.findById(id).exec();
    done(null, user);
  } catch (err) {
    done(err);
  }
});

Включая.exec()починил это.

В вызове axios мне пришлось включить:

      axios.defaults.withCredentials = true;

Тогда в моемapp.js:

      app.use(
  cors({
    origin: "http://localhost:3000",
    credentials: true,
  })
);
Другие вопросы по тегам