На сервере. js (порт 4000) Я получил этот маршрут:
// Auth middleware that checks if the user is logged in
const isLoggedIn = (req, res, next) => {
if (req.user) {
next();
}
else {
res.sendStatus(401);
}
}
app.get('/good', isLoggedIn, (req, res) => res.send(req.user));
или даже это:
app.get('/good', (req, res) => res.send(req.user));
Первоначально я хотел получить данные пользователя с помощью запроса graphql , но что угодно. Теперь я хочу получить эти данные req.user в моем компоненте реакции, клиент находится на порту 3000 (я просто хочу знать, вошел ли я в систему или нет). Я пробовал использовать fetch и ax ios, но похоже, что он не видел req.user (но когда я использую функцию isLoggedIn, он видит, что req.user is = "", и он показывает ошибку 401, как построена функция).
на http://localhost: 4000 / хорошие данные отображаются правильно.
Подробнее:
const express = require('express');
const cors = require('cors');
const path = require('path');
const mongoose = require('mongoose');
require('dotenv').config();
const passport = require('passport');
require('./modules/auth');
const cookieSession = require('cookie-session');
// #6 Initialize an Express application
const app = express();
// app.use(cors());
app.use(
cors({
origin: "http://localhost:3000",
credentials: true
})
);
app.use(cookieSession({
name: 'session',
keys: ['key1', 'key2']
}))
app.use(passport.initialize());
app.use(passport.session());
app.get('/auth/google', passport.authenticate('google', { scope: ['profile','email'] }));
app.get('/auth/google/callback', passport.authenticate('google', {
successRedirect: 'http://localhost:4000/graphql',
failureRedirect: 'http://localhost:4000/graphql',
}));
// Auth middleware that checks if the user is logged in
const isLoggedIn = (req, res, next) => {
if (req.user) {
next();
}
else {
res.sendStatus(401);
}
}
app.get('/good', isLoggedIn, (req, res) => res.send(req.user));
// route for logging out
app.get('/logout', (req, res) => {
req.session = null;
req.logout();
res.redirect('/');
});
// Connect to Mongo and Apollo Server( skipped that, it's not the case)
// #7 Use the Express application as middleware in Apollo server( server was Apollo Server)
server.applyMiddleware({ app });
app.use(express.static('public'));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'public', 'index.html'))
});
const PORT = process.env.PORT || 4000;
app.listen(PORT, () => console.log(`Server started on port ${PORT}`));
Бонус: вот дополнительная идея ApolloServer :
сервер. js (пропущенная часть):
const { ApolloServer } = require('apollo-server-express');
const typeDefs = require('./modules/graphqlschemas/index');
const resolvers = require('./modules/resolvers/index');
// #5 Initialize an Apollo server
const server = new ApolloServer({
typeDefs: typeDefs,
resolvers: resolvers,
// context: ({ req, res }) => ({ req, res })
context: ({ req }) => ({
getUser: () => req.user,
logout: () => req.logout(),
})
});
распознаватель пользователей (часть с текущим запросом пользователя):
module.exports = {
Query: {
users: () => User.find({}),
currentUser: (parent, args, context) => context.getUser()
},
...