Я новичок в 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!");
})
Могу я узнать в чем проблема? Я действительно ценю любую предоставленную помощь. Спасибо.