首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将上传类型添加到GraphQL

将上传类型添加到GraphQL
EN

Stack Overflow用户
提问于 2020-01-02 22:40:15
回答 1查看 1.1K关注 0票数 0

我试图创建一个自定义解析器,以上传一个用户的化身图像,为一个快车+阿波罗服务器+蒙鹅项目,这是使用composeWithMongoose

用户解析器是用SchemaComposer创建的,它从Mongoose模式生成它们,如下所示:

用户模型

代码语言:javascript
复制
import mongoose, { Schema } from 'mongoose';
import timestamps from 'mongoose-timestamp';
import bcrypt from 'mongoose-bcrypt';
import { composeWithMongoose } from 'graphql-compose-mongoose';

export const UserSchema = new Schema(
    {
        name: {
            type: String,
            trim: true,
            required: true,
        },
        email: {
            type: String,
            lowercase: true,
            trim: true,
            unique: true,
        },
        phone: {
            type: Number,
            trim: true,
            unique: true,
        },
        password: {
            type: String,
            bcrypt: true,
        },
        type: {
            type: String,
        },
        image: {
            type: String,
            trim: true,
            lowercase: true,
        },
    },
    {
        collection: 'users',
    }
);

UserSchema.plugin(timestamps);
UserSchema.plugin(bcrypt);

UserSchema.index({ createdAt: 1, updatedAt: 1 });

export const User = mongoose.model('User', UserSchema);
export const UserTC = composeWithMongoose(User);

用户模式

代码语言:javascript
复制
import { User, UserTC } from '../models/user';

const UserQuery = {
    userById: UserTC.getResolver('findById'),
    userByIds: UserTC.getResolver('findByIds'),
    userOne: UserTC.getResolver('findOne'),
    userMany: UserTC.getResolver('findMany'),
    userCount: UserTC.getResolver('count'),
    userConnection: UserTC.getResolver('connection'),
    userPagination: UserTC.getResolver('pagination'),
};

const UserMutation = {
    userCreateOne: UserTC.getResolver('createOne'),
    userCreateMany: UserTC.getResolver('createMany'),
    userUpdateById: UserTC.getResolver('updateById'),
    userUpdateOne: UserTC.getResolver('updateOne'),
    userUpdateMany: UserTC.getResolver('updateMany'),
    userRemoveById: UserTC.getResolver('removeById'),
    userRemoveOne: UserTC.getResolver('removeOne'),
    userRemoveMany: UserTC.getResolver('removeMany'),
};

export { UserQuery, UserMutation };

根据graphql-合成-猫鼬文档以及我所理解的,我必须使用ObjectTypeComposer (UserTC)方法addResolver() (如:

用户模式

代码语言:javascript
复制
import { User, UserTC } from '../models/user';
import { GraphQLUpload } from 'graphql-upload';

UserTC.addResolver({
    name: 'uploadImage',
    type: 'String',
    args: { userId: 'MongoID!', image: 'Upload!' },
    resolve: async ({ source, args, context, info }) => {
        const user = await User.findById({ _id: args.userId }).exec();
        console.log(user);
    }
});

const UserQuery = {
    ...
};

const UserMutation = {
    ...
    uploadImage: UserTC.getResolver('uploadImage'),
};

export { UserQuery, UserMutation };

在我将image参数类型从String更改为Upload之前,它一直在工作。默认情况下,根据阿波罗文件启用了Where。

我在控制台中得到了这个错误:Error: Type with name "Upload" does not exists

但在本例中,我不知道如何使用composeWithMongoose()向自己的类型定义添加内容。

我有兴趣听到其他方法--也许使用完全不同的方法是完全有效的。

编辑1:回复@Daniel Rearden

我仍然得到Upload类型不存在:

抛出新错误(Type with name ${(0, \_misc.inspect)(typeName)} does not exists);^ 错误:不存在名为“上载”的类型

  1. 我安装了:express-graphqlapollo-upload-server
  2. 我将中间件添加到服务器配置中:
代码语言:javascript
复制
import dotenv from 'dotenv';
import express from 'express';
import { ApolloServer } from 'apollo-server-express';
import mongoose from 'mongoose';
import bodyParser from 'body-parser';
import { apolloUploadExpress } from 'apollo-upload-server'; 
import './utils/db';
import schema from './schema';

dotenv.config();

const app = express();

app.use(
    bodyParser.json(),
    apolloUploadExpress()
);

const server = new ApolloServer({
    schema,
    cors: true,
    playground: process.env.NODE_ENV === 'development' ? true : false,
    introspection: true,
    tracing: true,
    path: '/',
});
...
  1. 我在Schema索引中提供了以下代码:
代码语言:javascript
复制
import { SchemaComposer } from 'graphql-compose';
import { GraphQLUpload } from 'apollo-upload-server';

import db from '../utils/db'; //eslint-disable-line no-unused-vars

const schemaComposer = new SchemaComposer();

schemaComposer.add(GraphQLUpload);
...

我仍然会收到错误:Error: Type with name "Upload" does not exists

编辑2:也是回复@Daniel Rearden

好的,我刚刚将自定义解析器添加到UserMutation模式中,它起了作用:

代码语言:javascript
复制
const UserMutation = {
    userCreateOne: UserTC.getResolver('createOne'),
    userCreateMany: UserTC.getResolver('createMany'),
    userUpdateById: UserTC.getResolver('updateById'),
    userUpdateOne: UserTC.getResolver('updateOne'),
    userUpdateMany: UserTC.getResolver('updateMany'),
    userRemoveById: UserTC.getResolver('removeById'),
    userRemoveOne: UserTC.getResolver('removeOne'),
    userRemoveMany: UserTC.getResolver('removeMany'),
    uploadImage: {
        type: 'String',
        args: {
            userId: 'String!',
            image: 'Upload'
        },
        resolve: async (_, { userId, image }) => {
            const user = await User.findById({ _id: userId}).exec();
            console.log(user);
        },
    }
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-03 00:08:13

正如docs所述:

注意:当使用typeDefs时,阿波罗服务器将标量上载添加到您的模式中,因此应该删除类型定义中的任何现有的标量上载声明。如果使用makeExecutableSchema创建模式并使用模式param将其传递给ApolloServer构造函数,请确保包括标量上载。

如果您没有使用typeDefsresolvers选项,而是直接将schema传递给ApolloServer的构造函数,则必须自己添加标量。graphql-compose的docs显示如何做到这一点,但它应该简单到:

代码语言:javascript
复制
import { schemaComposer } from 'graphql-compose'
import { GraphQLUpload } from 'apollo-server'

schemaComposer.add(GraphQLUpload)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59570951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档