我试图创建一个自定义解析器,以上传一个用户的化身图像,为一个快车+阿波罗服务器+蒙鹅项目,这是使用composeWithMongoose。
用户解析器是用SchemaComposer创建的,它从Mongoose模式生成它们,如下所示:
用户模型
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);用户模式
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() (如:
用户模式
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);^ 错误:不存在名为“上载”的类型
express-graphql和apollo-upload-server。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: '/',
});
...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模式中,它起了作用:
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);
},
}
};发布于 2020-01-03 00:08:13
正如docs所述:
注意:当使用typeDefs时,阿波罗服务器将标量上载添加到您的模式中,因此应该删除类型定义中的任何现有的标量上载声明。如果使用makeExecutableSchema创建模式并使用模式param将其传递给ApolloServer构造函数,请确保包括标量上载。
如果您没有使用typeDefs和resolvers选项,而是直接将schema传递给ApolloServer的构造函数,则必须自己添加标量。graphql-compose的docs显示如何做到这一点,但它应该简单到:
import { schemaComposer } from 'graphql-compose'
import { GraphQLUpload } from 'apollo-server'
schemaComposer.add(GraphQLUpload)https://stackoverflow.com/questions/59570951
复制相似问题