сеанс не сохраняется и не определен req.user после перенаправления - PullRequest
1 голос
/ 15 марта 2020

Я новичок в Node и Express, и я впервые задаю вопрос о переполнении стека. Пожалуйста, прости меня, если я допустил ошибки новичка.

Я пытался создать веб-приложение для обмена книгами, чтобы пользователи могли загружать и делиться книгами в Интернете. Технический стек, который я использую, это Node, Express, MongoDB и React. Я использовал Passport. js для обработки аутентификации пользователя и сеанса. Сеанс, созданный после входа пользователя в систему, по-видимому, не сохраняется после перенаправления или обновления страницы sh.

Ниже приведен маршрут, который обрабатывает вход и регистрацию пользователя:

user .route. js

const mongoose = require("mongoose");
const express = require("express");
const router = express.Router();
const passport = require("passport");
const User = require("../models/User");

router.route("/register").post((req, res, next) => {

  const newUser = new User({
    username: req.body.username,
    email: req.body.email
  });

  // Register new User with password
  // Password will be automatically hashed and salted
  User.register(newUser, req.body.password, (error, user) => {
    if (error) {
      next(error);
    } else {
      passport.authenticate("local")(req, res, () => {
        res.status(200).json(req.isAuthenticated());
      })
    }
  })
});

router.route("/login").post((req, res, next) => {

  const loggedInUser = new User({
    username: req.body.username,
    password: req.body.password
  });

  req.login(loggedInUser, error => {
    if (error) {
      next(error);
    } else {
      console.log(req.user);
      console.log(req.session.id);
      passport.authenticate("local")(req, res, () => {
        res.status(200).json(req.isAuthenticated()); // Send login status to Login component
      });
    }
  });

});

module.exports = router;

И console.log (req.user), и console.log (req.session.id) показывают, что сеанс действительно создан.

Однако проблема возникла, когда я пытался получить доступ к req.user в книжном маршруте. Я хотел, чтобы пользователи могли загружать и сохранять книги в своей учетной записи. req.user больше не существует, и console.log показывает "undefined". Ниже приведен раздел book.route. js, который обрабатывает почтовые запросы пользователей:

router.route("/add-book").post(upload.single("image"), (req, res, next) => {

  if (req.file) {
    const newBook = new Book({
      name: req.body.name,
      author: req.body.author,
      description: req.body.description,
      genre: req.body.genre,
      image: {
        data: fs.readFileSync(req.file.path), // Get buffer data
        contentType: req.file.mimetype
      }
    });

    console.log(req.user);

    User.findOne({_id: req.user._id}).
    populate("books").
    exec((error, newBook) => {
      if (error) {
        return next(error);
      } else {
        console.log("Saved to user!");
      }
    });

  // Ignore below
  //   newBook.save((error, savedBook) => {
  //     if (error) {
  //       return next(error);
  //     } else {
  //       console.log(savedBook);
  //       res.status(201).json(savedBook); // New book created
  //     }
  // });
} else {
    console.log("No file uploaded");
  }
});

Ниже находится мой сервер. js file:

require("dotenv").config()
const express = require("express");
const cookieParser = require('cookie-parser')
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const cors = require("cors");
const dbConfig = require("./database/db"); // db connection
const session = require("express-session");
const passport = require("passport");
const User = require("./models/User");

// Express route
const bookRoute = require("./routes/book.route");
const userRoute = require("./routes/user.route");

const app = express();
app.use(cookieParser())
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(cors());

// Connect to MongoDB database;
mongoose.connect(dbConfig.db, {useNewUrlParser: true, useFindAndModify: false, useUnifiedTopology: true}).then(() => {
  console.log("Database successfully connected!");
}).catch((error) => {
  console.log(`Database not connected: ${error}`);
});

mongoose.set("useCreateIndex", true);

// Configure and setup session
app.use(session({
  secret: process.env.SECRET,
  resave: false,
  saveUninitialized: false,
}));

// initialize passport and use it with session
app.use(passport.initialize());
app.use(passport.session());

// passport config
// For more information on serialize and deserialize: https://stackoverflow.com/questions/27637609/understanding-passport-serialize-deserialize
passport.use(User.createStrategy());

// used to serialize the user for the session
passport.serializeUser((user, done) => {
    done(null, user.id); // Save user id into session
});

// used to deserialize the user
passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user);
    });
});

app.use("/", userRoute);
app.use("/", bookRoute);

// Port
//process.env is a global variable injected by Node at runtime
// It represents the state of the system environment of your application
const port = process.env.PORT || 4000;
app.listen(port, () => {
  console.log(`Server is listening at port ${port}`);
});

// 404
app.use((req, res, next) => {
  console.log(req.user);
  res.status(404).send("Sorry page not found!");
})

Могу я узнать в чем проблема? Я действительно ценю любую предоставленную помощь. Спасибо.

...