我有三个不同的 PostGres 表,每个表包含不同类型的同事。每种类型的数据库字段都不同——这就是它们位于三个单独的表中的原因。
我有一个组件可以访问任何类型的同事。现在从我迄今为止遇到的示例来看,一个组件通常与一个 GraphQL 查询相关联,例如:
const withData = graphql(GETONEASSOCIATE_QUERY, {
options({ navID }) {
return {
variables: { _id: navID}
};
}
,
props({ data: { loading, getOneAssociate } }) {
return { loading, getOneAssociate };
},
});
export default compose(
withData,
withApollo
)(AssociatesList);
Run Code Online (Sandbox Code Playgroud)
似乎给定的 GraphQL 查询只能返回单一类型的记录,例如在模式中:
getOneAssociate(associateType: String): [associateAccountingType]
Run Code Online (Sandbox Code Playgroud)
问题:是否可以设计一个 GraphQL 模式,使得单个查询可以返回不同类型的对象?解析器可以接收一个 AssociateType 参数,该参数告诉它要引用哪个 postGres 表。但是架构会是什么样子,以便它可以根据需要返回 AssociateAccountingType、associateArtDirectorType、associateAccountExecType 等类型的对象?
预先感谢所有人提供的任何信息。
所以当我启动我的服务器时,我得到了这个错误列表
/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:966
throw (0, _error.syntaxError)(lexer.source, token.start, 'Expected ' + kind + ', found ' + (0, _lexer.getTokenDesc)(token));
^
GraphQLError
at syntaxError (/Users/charlie/workspace/HackQLServer/node_modules/graphql/error/syntaxError.js:28:15)
at expect (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:966:32)
at parseName (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:88:15)
at parseInputValueDef (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:743:14)
at many (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:1015:16)
at parseArgumentDefs (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:735:10)
at parseFieldDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:714:14)
at any (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:1002:16)
at parseObjectTypeDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:683:16)
at parseTypeSystemDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:607:16)
at parseDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:148:16)
at parseDocument (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:106:22)
at Object.parse (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:43:10)
at buildSchemaFromTypeDefinitions (/Users/charlie/workspace/HackQLServer/node_modules/graphql-tools/src/schemaGenerator.ts:145:37)
at _generateSchema (/Users/charlie/workspace/HackQLServer/node_modules/graphql-tools/src/schemaGenerator.ts:72:18)
at makeExecutableSchema (/Users/charlie/workspace/HackQLServer/node_modules/graphql-tools/src/schemaGenerator.ts:97:20)
随着这一切的出现。我真的不明白我的错误在哪里。这是我的架构文件,我假设错误是
const typeDefinitions = `
type Author {
id: Int
firstName: String
lastName: …Run Code Online (Sandbox Code Playgroud) 假设我有以下 typedef:
interface Node {
id: ID!
}
type Foo implements Node {
id: ID!
quantity: Int
}
type Bar implements Node {
id: ID!
name: String
}
Run Code Online (Sandbox Code Playgroud)
我发出的每一个ID,我都想以同样的方式处理。目前我需要一些解析器,如:
interface Node {
id: ID!
}
type Foo implements Node {
id: ID!
quantity: Int
}
type Bar implements Node {
id: ID!
name: String
}
Run Code Online (Sandbox Code Playgroud)
使用许多类型实现Node,这会导致大量代码重复,开发人员很容易忘记编码 id 的正确方法,或者忘记将它们全部编码。
有没有办法做这样的事情?
{
// ...
Foo: {
id: (root) => encodeId(root.id, root.type),
// ...
},
Bar: {
id: (root) => encodeId(root.id, …Run Code Online (Sandbox Code Playgroud) 使用 graphql-yoga 我试图编写笑话测试来覆盖订阅。
如果订阅有效(使用身份验证),我能够成功测试快乐路径。不幸的是,我无法测试订阅 websocket 连接被拒绝的情况。
在我的服务器设置中,我拒绝任何未通过我的身份验证标准的 websocket 连接:
const app = await server.start({
cors,
port: process.env.NODE_ENV === "test" ? 0 : 4000,
subscriptions: {
path: "/",
onConnect: async (connectionParams: any) => {
const token = connectionParams.token;
if (!token) {
throw new AssertionError({ message: "NO TOKEN PRESENT" });
}
const decoded = parseToken(token, process.env.JWT_SECRET as string);
const user = await validateTokenVersion(decoded, redis);
if (user === {}) {
throw new AssertionError({ message: "NO VALID USER" });
}
return { user }; …Run Code Online (Sandbox Code Playgroud) typescript jestjs graphql apollo-server graphql-subscriptions
我正在阅读有关阿波罗联邦以及如何从模式拼接迁移的信息,当我阅读时出现了一个问题:
从拼接网关迁移到 Apollo Federation 的基本策略是首先使底层服务具有联邦能力
基本上联邦网关不能接受另一个不知道联邦的服务?所以没有办法将联合与另一个 graphql 服务器(例如https://github.com/nuwave/lighthouse)一起使用,还是我应该误解那条线?
我使用 graphql-tools 缝合了两个 graphql 端点。使用一个端点架构它工作正常,但使用另一个架构它会抛出此错误“GraphQLError:在类型中找不到字段:'query_root'”。即使我可以在内省时看到所有模式。
const createRemoteExecutableSchemas = async () => {
let schemas = [];
for (let api of graphqlApis) {
const http = http_link.HttpLink({
uri: api.uri,
fetch:fetch
});
const link1 = setContext.setContext((request, previousContext) => {
return {
headers:{authorization: previousContext.graphqlContext.headers.authorization}
}
}).concat(http);
const link2 = setContext.setContext((request, previousContext) => ({
headers: {
'x-hasura-admin-secret': api.secret
}
})).concat(http);
const remoteSchema = await gtool.introspectSchema(link2);
const remoteExecutableSchema = gtool.makeRemoteExecutableSchema({
schema: remoteSchema,
link:link1
});
schemas.push(remoteExecutableSchema);
}
return schemas;
};
const createNewSchema = async () => …Run Code Online (Sandbox Code Playgroud) 有时,您需要 API 来执行不涉及检索或操作数据的操作。例如,发送“忘记密码”电子邮件或与第三方 API 交互。
Apollo(或 GraphQL 本身)是否有推荐的方法来实现这一点?
如果没有,有什么解决方案可以在仍然利用 Apollo 的好处(例如模式/类型检查)的同时实现这一点?
我已经在 GraphQL 服务器上工作了一段时间,虽然我了解大部分方面,但我似乎无法掌握缓存。
谈到缓存,我看到提到了 DataLoader 和 Redis,但我不清楚什么时候应该使用什么以及如何使用它们。
我认为 DataLoader 在字段级别上更多地用于解决 n+1 问题?我猜 Redis 处于更高的水平呢?
如果有人能对此有所了解,我将不胜感激。
谢谢你。
当我模拟production(aka, playground is disabled) 并转到我的根目录时,http://localhost:9000/我收到以下响应:
400 Bad Request
GET query missing
Run Code Online (Sandbox Code Playgroud)
有没有办法防止这种情况或解决方法来呈现其他页面?
我是阿波罗的新手。我只使用apollo-server(没有快递)。我将不胜感激任何帮助。
我有这些代码行来初始化 ApolloServer,它工作正常
const server = new ApolloServer({schema, executor});
return server.listen(port).then(({url}) => {});
Run Code Online (Sandbox Code Playgroud)
我想更改 URL,这样做
return server.listen(port).then(({"dev.cold.net"}) => {});
Run Code Online (Sandbox Code Playgroud)
但我有一个编译错误:
TS2339: Property 'dev.cold.net' does not exist on type 'ServerInfo'
Run Code Online (Sandbox Code Playgroud) apollo-server ×10
graphql ×8
apollo ×4
apollostack ×2
node.js ×2
typescript ×2
caching ×1
jestjs ×1
nodes ×1
redis ×1
schema ×1
sequelize.js ×1