GraphQLJS ใช้ไฟล์. Graphql สำหรับแบบสอบถามจาก nodejs

Aug 24 2020

ฉันได้สร้างแอป 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ที่สามารถเรียกได้โดยมีอาร์กิวเมนต์

สิ่งนี้มีอยู่แล้วหรือไม่? หรือมีเครื่องมือหรือเอกสารประกอบใดบ้างที่สามารถช่วยให้ฉันทำงานได้ตามต้องการ

ขอบคุณสำหรับความช่วยเหลือ!

คำตอบ

2 slideshowp2 Sep 10 2020 at 16:01

คุณสามารถใช้การโหลดเอกสารของ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' } ] }