使用 Express 进行用户身份验证的 GraphQL 上下文

问题描述 投票:0回答:0

我正在尝试使用 GraphQL 和 Express 创建一个简单的用户身份验证过程,但每次我尝试触发我的查询“我”时,我都会出错。

这是我的代码:

注册和登录突变工作完美。

但是 me 查询是空的,就像用户对象是空的一样

const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
const { PrismaClient } = require('@prisma/client');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const { AuthenticationError } = require('apollo-server-errors');
require('dotenv').config();

const prisma = new PrismaClient();

const typeDefs = gql`
    type User {
        id: ID!
        name: String!
        email: String!
    }

    type AuthPayload {
        token: String!
        user: User!
    }

    type Query {
        me: User
    }

    type Mutation {
        login(email: String!, password: String!): AuthPayload
        signup(name: String!, email: String!, password: String!): AuthPayload
    }
`;

const resolvers = {
    Query: {
        me: async (_, __, { prisma, user }) => {
            if (!user) {
                throw new AuthenticationError('You must be logged in');
            }

            try {
                const userData = await prisma.user.findUnique({
                    where: { id: user.id },
                });
                return userData;
            } catch (error) {
                throw new Error('Unable to retrieve user data');
            }
        },
    },
    Mutation: {
        login: async (parent, { email, password }) => {
            const user = await prisma.user.findUnique({ where: { email } });

            if (!user) {
                throw new Error('Invalid email or password');
            }

            const validPassword = await bcrypt.compare(password, user.password);

            if (!validPassword) {
                throw new Error('Invalid email or password');
            }

            const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET);

            return {
                token,
                user,
            };
        },
        signup: async (parent, { name, email, password }) => {
            const hashedPassword = await bcrypt.hash(password, 10);

            const user = await prisma.user.create({
                data: {
                    name,
                    email,
                    password: hashedPassword,
                },
            });

            const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET);

            return {
                token,
                user,
            };
        },
    },
};

const context = ({ req }) => {
    const token = req.headers.authorization || '';
    try {
        const user = jwt.verify(token, process.env.JWT_SECRET);
        return { prisma, user };
    } catch (error) {
        return { prisma };
    }
};

const server = new ApolloServer({
    typeDefs,
    resolvers,
    context,
});

const app = express();

async function startApolloServer() {
    await server.start();
    server.applyMiddleware({ app });
}

startApolloServer();

app.listen({ port: 4000 }, () =>
    console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`)
);

注册和登录后好像什么都没有保存(突变正在工作),我的“我”查询是空的。

node.js express graphql
© www.soinside.com 2019 - 2024. All rights reserved.