我遵循Ben Awad的youtube课程。我在将用户ID传递到会话时遇到了一些问题。由于某种原因,它似乎并不持久。登录解析器正在运行。只有me解析器出现故障。当我运行me解析器时,它返回null而不是'me'对象。
我还检查了将express-session用作中间件的代码,这似乎也没问题
我的解析器内部上下文中的会话对象不包含userId。返回未定义
有人在听Ben的课程吗,遇到以下问题并设法解决?任何指针表示赞赏。谢谢
如果有人需要进一步的信息,我已将代码推送到github codes on github
爱
startServer.ts
const normalizeUrl = require('normalize-url');
normalizeUrl('example.com/');
//=> 'http://example.com'
登录解析器
// 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;
}
}
};
middleware.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 } });
})
}
};
createMiddleware.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;
};