Нет доступа к сеансу или req.user в getServerSideProps в nextjs - PullRequest
0 голосов
/ 21 июня 2020

Мне нужно получить данные на основе userId, но с использованием SSR и функций SSR, как я могу получить доступ к userId, полученному после успешного входа в систему, в функции SSR getServerSideProps, предоставляемой Next JS . Прямо сейчас у меня есть следующая реализация.

Пользователь перенаправляется на pages/index.js после входа в систему. Это pages/index.js

import { useUser } from '../libs/hooks';
import { client } from '../middlewares/database';
import Home from './Home';
import Landing from './Landing';

const App = ({ data }) => {
  
    const [user] = useUser();
    /* I have the user details here and I have a hook for getting user details,
but this is the client-side */
    return user?<Home data={data} />:<Landing />
}

export async function getServerSideProps(context) {
    const userId = context.req.headers.userId;
    // userId is undefined here, I need the userId here
    if (!client.isConnected()) await client.connect();

    const db = client.db(process.env.DB_NAME);
    const response = await db.collection("data").find({ userId });
    
    return { props: { data: response } }
}

export default App;

Я использую passport.js и next-session для аутентификации пользователя и создания сеанса sid, доступного во всех функциях. Если я могу сохранить userId в сеансе, это тоже поможет.

Это мой промежуточный слой сервера.

import nextConnect from "next-connect";
import passport from "../libs/passport";
import database from "./database";
import session from "./session";

const middleware = nextConnect();

middleware
  .use(database)
  .use(session)
  .use(passport.initialize())
  .use(passport.session());

export default middleware;

Вот так выглядит файл авторизации входа; auth.js

import nextConnect from 'next-connect';
import { session } from 'next-session';
import { extractUser } from '../../libs/api-helpers';
import passport from '../../libs/passport';
import middleware from '../../middlewares/middleware';

const handler = nextConnect();
handler.use(middleware);

handler.post(passport.authenticate('local'), async (req, res) => {

  res.json({ user: extractUser(req) });
});

Я могу использовать либо подход повара ie, либо подход сеанса. Как мне добиться этого в этом сценарии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...