NextJS с паспортом и следующим подключением: req.user не определен после успешного входа в систему
Я следую примеру with-Паспорт-и-следующее-подключение из репозитория примеров Next.js.
Я могу получить авторизацию для входа в систему, но я не могу понять, как они могут получить пользователя:
страницы / api / логин:
Как я уже сказал, я получаю пользователя из своей базы данных, но думаю включить его:
import nextConnect from 'next-connect'
import auth from '../../middleware/auth'
import passport from '../../lib/passport'
import connectDB from '../../lib/mongodb';
const handler = nextConnect()
handler.use(auth).post(
async (req, res, next) => {
await connectDB();
passport.authenticate('local', (err, user, info) => {
console.log("user ", user);
if (err) { return errorHandler(err, res) }
if (user) {
if (user.isVerified) {
return res.status(200).send({
userId: user._id,
msg: `Your have successfully logged in; Welcome to Hillfinder!`
});
}
}
})(req, res, next);
})
export default handler
страницы / api / пользователь:
import nextConnect from 'next-connect'
import auth from '../../middleware/auth'
const handler = nextConnect()
handler
.use(auth)
.get((req, res) => {
console.log("in api/user req.user ", req.user); // returns undefined
console.log("in api/user req.session ", req.session); // when you get to req.session: { maxAge: 28800, createdAt: 1635089347820, user: [] },
if (req.user) {
const { _id } = req.user
res.json({ user: { _id } })
} else {
res.json({ user: null })
}
})
export default handler
Это файл аутентификации из
../../middleware/auth
выше:
import nextConnect from 'next-connect'
import passport from '../lib/passport'
import session from '../lib/session'
import connectDB from '../lib/mongodb';
const auth = nextConnect()
.use(
session({
name: 'sess',
secret: process.env.TOKEN_SECRET,
cookie: {
maxAge: 60 * 60 * 8, // 8 hours,
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
path: '/',
sameSite: 'lax',
},
})
)
.use((req, res, next) => {
// Initialize mocked database
// Remove this after you add your own database
connectDB()
req.session.user = req.session.user || []
next()
})
.use(passport.initialize())
.use(passport.session())
export default auth
Мне нужен пользователь из-за этого хука, который помогает с доступом к маршрутам на клиенте:
import useSWR from 'swr'
export const fetcher = (url) => fetch(url).then((r) => r.json())
export function useUser() {
const { data, mutate } = useSWR('/api/user', fetcher)
// if data is not defined, the query has not completed
console.log("data in useUser hooks!", data);
console.log("data?.user ", data?.user);
const loading = !data
const user = data?.user
return [user, { mutate, loading }]
Пример настройки в обработчике входа в систему клиента:
import axios from 'axios';
export default function loginSubmit(
user,
mutate
) {
const data = {
email,
password,
};
axios
.post(`/api/login`,
data, // request body as string
{ // options
withCredentials: true,
headers: {
'Content-Type': 'application/json'
}
}
)
.then(response => {
if (response.status === 200) {
mutate(response.data.user.userId)
setTimeout(() => {
router.push('/profile');
}, 3000);
}
})
.catch((error) => {
...error handling
});
}
Так почему я получаю undefined, когда получаю пользователя?