Я следую за уроками Бена Авада на YouTube. Я столкнулся с некоторой проблемой при передаче идентификатора пользователя в сеанс. Это, кажется, не сохраняется по какой-то причине. Разрешение входа в систему работает. Только мой распознаватель терпит неудачу. Когда я запускаю распознаватель me, он возвращает нуль, а не объект «me».
Я также проверил код для использования Express-сессии в качестве промежуточного программного обеспечения, и, кажется, тоже хорошо
Объект сеанса в контексте внутри распознавателя me не содержит userId. Возвращает неопределенное
Кто-нибудь следит за уроками Бена, столкнулся со следующей проблемой и сумел ее исправить? Любые указатели приветствуются. Спасибо
Я отправил свои коды на github, если кому-то понадобится дополнительная информация
коды на github
Love
startServer.ts
// Session Middleware
server.express.use(
session({
store: new RedisStore({
client: redis as any,
prefix: redisSessionPrefix
}),
name: "qid",
secret: SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
maxAge: 1000 * 60 * 60 * 24 * 7 // 7 days
}
})
);
распознаватели логина
import * as bcrypt from "bcryptjs";
import { User } from "./../../entity/User";
import { ResolverMap } from "./../../types/graphql-utils";
import {
invalidLogin,
confirmEmailError,
forgotPasswordLockedError
} from "./errorMessages";
import { userSessionIdPrefix } from "../../constants";
const errorResponse = [
{
path: "email",
message: invalidLogin
}
];
export const resolvers: ResolverMap = {
Query: {
bye2: () => {
return "Bye";
}
},
Mutation: {
login: async (
_,
{ email, password }: GQL.ILoginOnMutationArguments,
{ session, redis, req }
) => {
// Check if user exists
const user = await User.findOne({ where: { email } });
// if no user found, return error message
if (!user) {
return errorResponse;
}
// if user has not confirmed email, return error message
if (!user.confirmed) {
return [
{
path: "email",
message: confirmEmailError
}
];
}
// if user has forgot password locked, return error message
if (user.forgotPasswordLocked) {
return [
{
path: "email",
message: forgotPasswordLockedError
}
];
}
// Check if login password is valid
const valid = await bcrypt.compare(password, user.password);
// if wrong password, return error message
if (!valid) {
return errorResponse;
}
console.log("Login session before set ", session);
// Set Cookie on Successful Login
session.userId = user.id;
console.log("Login session after set", session.userId);
// Add to Session List
if (req.sessionID) {
console.log("session Id", req.sessionID);
console.log("userId ", user.id);
await redis.lpush(`${userSessionIdPrefix}${user.id}`, req.sessionID);
}
return null;
}
}
};
me resolvers.ts
import { ResolverMap } from "../../types/graphql-utils";
import { User } from "../../entity/User";
import { createMiddleware } from "../../utils/createMiddleware";
import middleware from "./middleware";
export const resolvers: ResolverMap = {
Query: {
me: createMiddleware(middleware, (_, __, { req, session }) => {
return User.findOne({ where: { id: session.userId } });
})
}
};
middleware.ts
import { Resolver } from "../../types/graphql-utils";
export default async (
resolver: Resolver,
parent: any,
args: any,
context: any,
info: any
) => {
// middleware
const result = await resolver(parent, args, context, info);
// afterware
return result;
};
createMiddleware.ts
import { Resolver, GraphQLMiddlewareFunc } from "../types/graphql-utils";
export const createMiddleware = (
middlewareFunc: GraphQLMiddlewareFunc,
resolverFunc: Resolver
) => (parent: any, args: any, context: any, info: any) =>
middlewareFunc(resolverFunc, parent, args, context, info);