GraphQLJS ใช้ไฟล์. Graphql สำหรับแบบสอบถามจาก nodejs
ฉันได้สร้างแอป GraphQL Express พื้นฐานแล้วและฉันต้องการรวมข้อมูลที่กำหนดไว้ล่วงหน้าจากการสืบค้นที่กำหนดไว้ล่วงหน้าพร้อมกับเส้นทางเฉพาะ
ตามหลักการแล้วแบบสอบถามควรอนุญาตให้มีอาร์กิวเมนต์เพื่อให้สามารถใช้งานได้อย่างยืดหยุ่นฉันต้องการที่จะสามารถบันทึกแบบสอบถามลงในไฟล์และเรียกใช้ตามความต้องการ แต่ให้อาร์กิวเมนต์เฉพาะสำหรับข้อมูลปัจจุบันที่ต้องการ
ฉันสามารถสอบถาม API ด้วยแบบสอบถามต่อไปนี้
query authors(ids: [1337, 42]) {
name,
id
}
query.graphqlไฟล์ควรเป็นสิ่งที่ต้องการต่อไปนี้:
getAuthorsById($ids: Int[]) { authors(ids: $ids) {
name,
id
}
}
สิ่งที่ฉันต้องการทำภายในเซิร์ฟเวอร์โหนดคือรับเนื้อหาจากquery.graphqlไฟล์และดำเนินการเมื่อมีการเรียกใช้เส้นทางเฉพาะเช่น
const query = somehowImportTheQuery('./query.graphql')
graphql(schema, query([1337, 42]))
โค้ดด้านบนsomehowImportTheQueryควรนำเข้าแบบสอบถามและส่งคืนฟังก์ชันgetAuthorsByIdที่สามารถเรียกได้โดยมีอาร์กิวเมนต์
สิ่งนี้มีอยู่แล้วหรือไม่? หรือมีเครื่องมือหรือเอกสารประกอบใดบ้างที่สามารถช่วยให้ฉันทำงานได้ตามต้องการ
ขอบคุณสำหรับความช่วยเหลือ!
คำตอบ
คุณสามารถใช้การโหลดเอกสารของgraphql-toolsโมดูลเพื่อโหลดเอกสารการทำงานของ GraphQL จากแหล่งต่างๆ
เช่น
index.ts:
import { GraphQLSchema, buildSchema, graphql } from 'graphql';
import { loadDocumentsSync, GraphQLFileLoader } from 'graphql-tools';
import path from 'path';
const typeDefs: string = `
type Author {
id: ID!
name: String
}
type Query {
authors(ids: [ID]!): [Author]!
}
`;
const resolvers = {
authors({ ids }) {
return [
{ id: ids[0], name: 'a' },
{ id: ids[1], name: 'b' },
];
},
};
const schema: GraphQLSchema = buildSchema(typeDefs);
const query = loadDocumentsSync(path.resolve(__dirname, './query.graphql'), {
loaders: [new GraphQLFileLoader()],
});
graphql({
schema,
source: query[0].rawSDL!,
rootValue: resolvers,
variableValues: { ids: [1337, 42] },
}).then(({ data }) => {
console.log(data);
});
query.graphql:
query getAuthorsById($ids: [ID]!) { authors(ids: $ids) {
name
id
}
}
ผลการดำเนินการ:
[Object: null prototype] {
authors:
[ [Object: null prototype] { name: 'a', id: '1337' },
[Object: null prototype] { name: 'b', id: '42' } ] }