해결된 질문
작성
·
284
·
수정됨
0
import { ApolloServer } from '@apollo/server'
import { startStandaloneServer } from '@apollo/server/standalone'
const typeDefs = `#graphql
input CreateBoardInput {
writer: String
title: String
contents: String
}
type MyResult {
number: Int
writer: String
title: String
contents: String
}
type Query {
#fetchboards: MyResult #객체 1개를 의미
fetchboards: [MyResult] # 배열 안에 객체 1개 이상을 의미!
}
type Mutation {
# createBoard(writer: String, title: String, contents: String): String
createBoard(createBoardInput: CreateBoardInput!): String
}`;
const resolvers = {
Query: {
fetchBoards: (parent, args, context, info) => {
// 1. 데이터를 조회하는 로직 => DB에 접속해서 데이터 꺼내오기
const result = [
{
number: 1,
writer: '철수',
title: '제목입니다~~',
contents: '내용이에요@@@',
},
{
number: 2,
writer: '영희',
title: '영희 제목입니다~~',
contents: '영희 내용이에요@@@',
},
{
number: 3,
writer: '훈이',
title: '훈이 제목입니다~~',
contents: '훈이 내용이에요@@@',
},
];
// 2. 꺼내온 결과 응답 주기
return result;
},
},
Mutation: {
createBoard: (_, args) => {
// 1. 브라우저에서 보내준 데이터 확인하기
console.log(args);
console.log("=========================")
console.log(args.createBoardInput.writer)
console.log(args.createBoardInput.title)
console.log(args.createBoardInput.contents)
// 2. DB에 접속 후, 데이터를 저장 => 데이터 저장했다고 가정
// 3. DB에 저장된 결과를 브라우저에 응답(response) 주기
return "게시물 등록에 성공하였습니다!!";
},
},
};
const server = new ApolloServer({
typeDefs: typeDefs,
resolvers: resolvers,
cors: true, // 모든 사이트 허용하고 싶을 때
// cors: { origin: ["https://naver.com", "https://daum.net"] } // 특정 사이트만 지정하고 싶을 때
});
startStandaloneServer(server) // 4000
node_modules/@graphql-tools/schema/esm/addResolversToSchema.js:62
throw new Error(`${typeName}.${fieldName} defined in resolvers, but not in schema`);
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
제출하신 코드와 에러 메시지를 보면, 스키마 정의와 리졸버(resolver) 함수 사이에 이름 불일치 이슈가 발생한 것으로 보입니다. 에러 메시지는 fetchBoards
라는 쿼리가 리졸버에 정의되어 있지만 스키마에는 등록되어 있지 않다고 나타내고 있습니다. 실제로 스키마에서는 fetchboards
로 되어 있는 반면 리졸버에서는 fetchBoards
로 대소문자 구분하여 사용하고 있습니다.
GraphQL에서는 대소문자를 구별하기 때문에 정확하게 일치해야 합니다. 이 문제를 해결하려면 스키마 정의에서의 쿼리 이름과 리졸버에서의 쿼리 이름을 동일하게 맞춰야 합니다.
즉, 스키마에서는
fetchboards: [MyResult] # 배열 안에 객체 1개 이상을 의미!
리졸버에서는
fetchBoards: (parent, args, context, info) => {
...
}
이렇게 되어 있는데, 둘 중 하나를 다른 쪽에 맞춰서 수정해야 합니다. 예를 들어, 스키마를 fetchBoards: [MyResult]
로 수정하거나, 리졸버를 fetchboards: (parent, args, context, info) => {...}
로 수정하시면 됩니다.
항상 코드 작성 시, 대소문자 구분에 주의하여 일관된 명명규칙을 따르는 것이 중요합니다.