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, когда получаю пользователя?

0 ответов

Другие вопросы по тегам