Обработка загрузки файла с помощью nexus-prisma graphql

Я пытаюсь загрузить файл из своего внешнего приложения на свой сервер, но продолжаю получать эту странную ошибку и не понимаю, почему это происходит

Ошибка внешнего интерфейса:

Variable "$file" got invalid value {}; Expected type Upload. Upload value invalid.

Ошибка в бэкэнде:

GraphQLError: Upload value invalid.
at GraphQLScalarType.parseValue (/app/backend/node_modules/graphql-upload/lib/GraphQLUpload.js:66:11)

вот как я добавил скаляр загрузки


// scalars/upload.ts
import { scalarType } from "nexus/dist";
import { GraphQLUpload } from "graphql-upload";

export const Upload = scalarType({
  name: "Upload",
  asNexusMethod: "upload", // We set this to be used as a method later as `t.upload()` if needed
  description: GraphQLUpload.description,
  serialize: GraphQLUpload.serialize,
  parseValue: GraphQLUpload.parseValue,
  parseLiteral: GraphQLUpload.parseLiteral,
});

export default Upload;

//scalar/index.ts
export { default as Upload } from "./Upload";

// index.ts
import * as allTypes from "./resolvers";
import * as scalars from "./scalars";
const schema = makePrismaSchema({
  types: [scalars, allTypes],
  prisma: {
    datamodelInfo,
    client: prisma,
  },
...

// my mutation 
t.string("uploadFile", {
      args: {
        file: arg({ type: "Upload", nullable: false }),
      },
      resolve: async (_: any, { file }, {  }: any) => {
        console.log(file);
        return "ok";
      },
    });

вот как я сделал клиент uplaod в моем приложении react / nextjs

// the link
const link = () => {
    return createUploadLink({
      uri: process.env.backend,
      credentials: "include",
      fetch,
    });
  };

// the mutation ( I use graphql codegen )

mutation TestUpload($file: Upload!) {
  uploadFile(file: $file)
}

const [upload] = useTestUploadMutation();

<input
            type="file"
            onChange={(e) => {
              const { files, validity } = e.target;
              if (validity.valid && files && files[0]) {
                upload({
                  variables: {
                    file: files[0],
                  },
                });
              }
            }}
          />

даже при попытке запустить мутацию с использованием чего-то другого, кроме моего внешнего приложения, я получаю ту же ошибку, поэтому я предполагаю, что проблема связана с настройкой моего внутреннего интерфейса, хотя я много искал способы сделать это, похоже, что никто не работает.

1 ответ

У меня была точно такая же проблема. Это исправило это. Таким образом, в основном определение загрузки вручную вместо использования GraphQLUpload

import { objectType, scalarType } from "@nexus/schema";
import { GraphQLError } from "graphql";
import * as FileType from "file-type";

export const Upload = scalarType({
  name: "Upload",
  asNexusMethod: "upload", // We set this to be used as a method later as `t.upload()` if needed
  description: "desc",
  serialize: () => {
    throw new GraphQLError("Upload serialization unsupported.");
  },
  parseValue: async (value) => {
    const upload = await value;
    const stream = upload.createReadStream();
    const fileType = await FileType.fromStream(stream);

    if (fileType?.mime !== upload.mimetype)
      throw new GraphQLError("Mime type does not match file content.");

    return upload;
  },
  parseLiteral: (ast) => {
    throw new GraphQLError("Upload literal unsupported.", ast);
  },
});

export const File = objectType({
  name: "File",
  definition(t) {
    t.id("id");
    t.string("path");
    t.string("filename");
    t.string("mimetype");
    t.string("encoding");
  },
});

Другие вопросы по тегам