Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缝合模式的解析程序返回null_Javascript_Node.js_Express_Graphql_Apollo Server - Fatal编程技术网

Javascript 缝合模式的解析程序返回null

Javascript 缝合模式的解析程序返回null,javascript,node.js,express,graphql,apollo-server,Javascript,Node.js,Express,Graphql,Apollo Server,我已经将我的大模式文件拆分为不同的模式文件,如bookSchema.js、userSchema.js等,如下所示: /****** typedefs/userSchema.js ******/ const { gql } = require('apollo-server-express'); const UserSchema = gql` extend type Query { whoami: User } type User { name: String! } `; exp

我已经将我的大模式文件拆分为不同的模式文件,如bookSchema.js、userSchema.js等,如下所示:


/****** typedefs/userSchema.js ******/
const { gql } = require('apollo-server-express');
const UserSchema = gql`
extend type Query {
    whoami: User
}
type User {
    name: String!
}
`;

export default UserSchema;


/****** typedefs/index.js ******/
const { gql } = require('apollo-server-express');
import UserSchema from './userSchema';
import BookSchema from './bookSchema';

const DefaultSchema = gql`
    type Query {
        _: Boolean
    }
    type Mutation {
        _: Boolean
    }
`;

const Schema = [DefaultSchema, UserSchema, BookSchema];

export default Schema;
对于每个模式,我定义了相应的解析器模块,如下所示:


/****** typedefs/userSchema.js ******/
const { gql } = require('apollo-server-express');
const UserSchema = gql`
extend type Query {
    whoami: User
}
type User {
    name: String!
}
`;

export default UserSchema;


/****** typedefs/index.js ******/
const { gql } = require('apollo-server-express');
import UserSchema from './userSchema';
import BookSchema from './bookSchema';

const DefaultSchema = gql`
    type Query {
        _: Boolean
    }
    type Mutation {
        _: Boolean
    }
`;

const Schema = [DefaultSchema, UserSchema, BookSchema];

export default Schema;
/****resolvers/booksolver.js******/
常量解析程序={
查询:{
books:(\uz,args,{models})=>models.Book.findAll(),
},
};
导出默认解析器;
/******解析程序/index.js******/
从“./userResolver”导入userResolver;
从“/booksolver”导入booksolver;
常量解析程序=[UserResolver,BookResolver]
导出默认解析器;
最后,我的app.js如下所示:


/****** typedefs/userSchema.js ******/
const { gql } = require('apollo-server-express');
const UserSchema = gql`
extend type Query {
    whoami: User
}
type User {
    name: String!
}
`;

export default UserSchema;


/****** typedefs/index.js ******/
const { gql } = require('apollo-server-express');
import UserSchema from './userSchema';
import BookSchema from './bookSchema';

const DefaultSchema = gql`
    type Query {
        _: Boolean
    }
    type Mutation {
        _: Boolean
    }
`;

const Schema = [DefaultSchema, UserSchema, BookSchema];

export default Schema;
从“apollo server express”导入{apollo server,gql};
从“../graphql/typedefs/”导入架构;
从“../graphql/Resolvers/”导入解析程序;
从“../Models/”导入模型;
从“graphql工具”导入{mergeSchemas};
...
常量模式=模式;
常量解析器=解析器;
常数模型=模型;
const me=models.User.me();
常量上下文={
模型,
我
};
const mergedSchema=mergeschema({
模式:模式
});
const server=new ApolloServer({schema:mergedSchema,解析器,context});
当我运行服务器并在GraphiQLWebInerFace中执行graphql查询时,会得到空值。在我将单一模式拆分为较小的模式并在我的
ApolloServer
构造中使用合并的模式后,为什么解析程序不映射到模式

如果您能想到这一点,我将不胜感激。提前谢谢

对于
“graphql工具”:“^6.0.15”
,配置
架构
需要
GraphQLSchema[]
类型。但是
gql
函数的返回值是
DocumentNode
类型

因此,我将使用函数为
User
Book
模块使用相应的typedef和解析器来获取模式

但事实上,
mergeSchemas
的作用不是在单个graphql服务中组织代码。它用于将多个graphql微服务合并到graphql端点中。看

我们可以创建对要使用的所有远程GraphQLAPI的引用,并将它们传递到mergeSchemas函数中以创建单个API

对于单个graphql服务的组织代码,
makeExecutableSchema
函数就足够了

我还是会给你一个解决问题的办法

例如

resolvers/booksolver.ts

const解析器={
查询:{
books:(quot,args)=>[{name:'jestjs'},{name:'js'}],
},
};
导出默认解析器;
resolvers/userResolver.ts

const解析器={
查询:{
whoami:(u,args,{models})=>({name:'teresa teng'}),
},
};
导出默认解析器;
解析器/index.ts

从“/userResolver”导入userResolver;
从“/booksolver”导入booksolver;
常量解析程序=[UserResolver,BookResolver];
导出默认解析器;
typedefs/bookSchema.ts

从'apollo server express'导入{gql};
const BookSchema=gql`
类型查询{
书:[书]!
}
打字簿{
名字:字符串!
}
`;
导出默认图书模式;
typedefs/userSchema.ts

从'apollo server express'导入{gql};
const UserSchema=gql`
类型查询{
whoami:用户
}
类型用户{
名字:字符串!
}
`;
导出默认用户模式;
typedefs/index.ts

从“/userSchema”导入userTypeDefs;
从“/bookSchema”导入bookTypeDefs;
从“apollo server express”导入{gql,makeExecutableSchema};
从“../resolvers”导入解析程序;
const defaultTypeDefs=gql`
类型查询{
_:布尔值
}
类型突变{
_:布尔值
}
`;
const[UserResolver,BookResolver]=解析程序;
const userSchema=makeExecutableSchema({typeDefs:userTypeDefs,解析器:UserResolvers});
const bookSchema=makeExecutableSchema({typeDefs:bookTypeDefs,解析器:bookResolver});
const defaultSchema=makeExecutableSchema({typeDefs:defaultTypeDefs});
导出默认值[userSchema,bookSchema,defaultSchema];
app.ts

从“阿波罗服务器”导入{ApolloServer};
从“/typedefs”导入架构;
从“/resolvers”导入解析程序;
从“graphql工具”导入{mergeSchemas};
const mergedSchema=mergeschema({
模式:模式,
});
const server=new ApolloServer({schema:mergedSchema,resolvers});
常数端口=3000;

然后({url}=>console.log(`好的,我通过稍微修改
mergeSchemas(options)
方法和
ApolloServer(config)
构造函数使事情井然有序,如下所示:


/****** typedefs/userSchema.js ******/
const { gql } = require('apollo-server-express');
const UserSchema = gql`
extend type Query {
    whoami: User
}
type User {
    name: String!
}
`;

export default UserSchema;


/****** typedefs/index.js ******/
const { gql } = require('apollo-server-express');
import UserSchema from './userSchema';
import BookSchema from './bookSchema';

const DefaultSchema = gql`
    type Query {
        _: Boolean
    }
    type Mutation {
        _: Boolean
    }
`;

const Schema = [DefaultSchema, UserSchema, BookSchema];

export default Schema;

//修改1:在此传递解析器
const mergedSchema=mergeschema({
模式:模式,
解析程序:解析程序,
});
//修改2:不要在这里传递解析器,因为mergedSchema已经有了它!!。。
const server=新服务器({
模式:合并模式,上下文
});

参考资料:

感谢分享您的想法;这确实很有帮助。我分享了我的答案,说明是什么改变使我的代码与参考资料的链接一起起作用。基于此,我认为我的方法也不错。想法??