上下文"/>
使用 Express 进行用户身份验证的 GraphQL 上下文
我正在尝试使用 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 bcryptpare(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(`
更多推荐
使用 Express 进行用户身份验证的 GraphQL 上下文
发布评论