Express-Session Cookies中不存在变量UserId

时间:2018-11-05 09:08:25

标签: node.js express session graphql

我遵循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;
};

0 个答案:

没有答案