Как загрузить файл через Apollo Server v4 и graphql-upload?

я использую сервер Apollo v4 с ExpressJS и NEXTJS для моего внешнего интерфейса. Я хочу создать мутацию, такую ​​​​как uploadFile, используя upload-graphql для загрузки файла на мой внутренний сервер.

тип загрузки

      export interface Upload {
    filename: string;
    mimetype: string;
    encoding: string;
    createReadStream: () => Stream;
  }

моя мутация:

      @Mutation(() => Boolean)
  async uploadFile(
    @Arg("picture", () => GraphQLUpload)
    { createReadStream, filename }: Upload
  ): Promise<boolean> {
    return new Promise(async (resolve, reject) =>
      createReadStream()
        .pipe(createWriteStream(__dirname + `/../../../images/${filename}`))
        .on("finish", () => resolve(true))
        .on("error", () => reject(false))
    );
  }
}

но проблема в том, что всякий раз, когда я загружаю что-то вроде фотографии, я получаюApolloError: Argument Validation Error.

Я думаю, что пока нет возможности загрузить через новую версию сервера Apollo (v4), но если кто-то знает об этом, пожалуйста, помогите мне!

мои зависимости

      "dependencies":{
   "@apollo/server": "^4.3.1",     
   "express": "^4.18.2",
   "graphql": "^16.6.0",     
   "graphql-fields": "^2.0.3",     
   "graphql-middleware": "^6.1.33",     
   "graphql-scalars": "^1.20.1",     
   "graphql-shield": "^7.6.5",     
   "graphql-upload": "14",     
   "type-graphql": "2.0.0-beta.1",   },

Я попытался загрузить файл на свой интерфейс nextjs — apollo-upload-client.

и интерфейс загрузки Сценарий

Это просто проект-хобби , и я знаю, что есть альтернативы использованию другого подхода для загрузки файлов =>, например, дополнительный API конечной точки или использование, например, s3, но я хочу, чтобы мои файлы загружались через graphql.

1 ответ

В соответствии с просьбой, вот фрагмент кода, основанный на ваших источниках (не проверенный), но вам следует добавить заголовок «Apollo-Require-Preflight» в createUploadLink, чтобы он работал.

      export const client = new ApolloClient({
    link: createUploadLink({
         headers: {"Apollo-Require-Preflight": "true"},
    }),
    cache: new InMemoryCache(),
});
Другие вопросы по тегам