我正在尝试使用 firebase 和 websockets (在 React Native 上)在 Graphql 中实现身份验证。
客户端使用 firebase 进行身份验证并获取令牌。然后,它通过 websocket 客户端将令牌发送到服务器,该客户端使用 admin sdk 验证用户。
我面临两个问题:
当应用程序启动时,它会建立一个 ws 连接,此时它没有授权标头。用户使用 firebase 一段时间后会获得一个令牌。
令牌会在一段时间后过期,因此一段时间后我需要更新 websocket 连接中的授权标头,并重新运行因令牌过期而被拒绝的查询、突变或订阅。
有没有办法更新授权标头并重新运行查询?
我是否需要关闭以前的连接并使用授权标头中的新令牌打开一个新连接?这是怎么做到的?
我正在使用 apollo-server、apollo-client、apollo-link、subscriptions-transport-ws。
我的问题:
我对 GraphQL 还很陌生,我正在使用 Apollo 服务器和客户端开发我的第一个全栈应用程序,这是一个简单的博客。
在客户端,我在两个不同的页面中使用相同的查询,但使用不同的变量。查询是通过 ID 或 slug 查询博客文章,具体取决于我使用的页面。所以结果是一样的,只是查询变量发生了变化。
当我在一个页面中使用查询时,我认为由于 Apollo 缓存,查询不会在第二页上运行。但事实并非如此。查询在第二个页面中再次运行,当然返回的结果与其他页面中的结果相同。
为什么 Apollo 在这种情况下不使用缓存?
这是我使用的代码:
在服务器端,我有一个非常基本的查询来从博客中获取文章,可以通过 ID 或 Slug 获取:
type Query {
...
article(id: ID, slug: String): Article
...
}
Run Code Online (Sandbox Code Playgroud)
在客户端,如果文章已发布,我会通过 slug 查询文章;如果文章仍是草稿,我会通过 ID 查询文章。
通过 slug 进行查询:
<Query
query={article}
variables={{ slug }}
fetchPolicy="cache-and-network"
>
{({ loading, error, data }) => {
return (
<Article
loading={loading}
article={data && data.article}
/>
);
}}
</Query>
Run Code Online (Sandbox Code Playgroud)
通过ID查询是相同的,除了变量param使用ID:
<Query
query={article}
variables={{ id }}
>
{({ loading, error, data }) => …Run Code Online (Sandbox Code Playgroud) 我创建了这个问题,以防有人对如何在 Apollo 中添加联合/多态类型感到好奇。希望这会让他们更容易。
在此示例中,我希望响应为 aWorksheet或ApiError
// typedefs.js
export default [`
schema {
query: Query
}
type Query {
worksheet(id: String!): Worksheet | Error
}
type Worksheet {
id: String!
name String
}
type ApiError {
code: String!
message: String!
}
`];
// resolvers.js
export default {
Query: {
worksheet(_, args, { loaders }) {
return loaders.worksheet.get(args.id).catch(() => {
// ApiError
return {
code: '1',
message: 'test'
}
});
}
}
};
// Express Server
import …Run Code Online (Sandbox Code Playgroud) 我是 Django 开发人员,所以第一次接触 vue 和 graphql,我不知道如何准确处理这个错误。
这是我的代码,我的查询可能有问题,
<template>
<section>
<div class="home">
<h2>hiii</h2>
<div v-for="i in allposts" :key="i.id">
<ul>
<li>
<h3>hey</h3>
<strong>{{id}}</strong>:
<span>{{title}}</span>
</li>
</ul>
</div>
</div>
</section>
</template>
<script>
import gql from "graphql-tag";
const PostQuery = gql`
query allposts {
allPosts {
id
title
}
}
`;
export default {
props: [],
data() {
return {
allposts: []
};
},
apollo: {
allposts: PostQuery
}
};
</script>
Run Code Online (Sandbox Code Playgroud)
可以看到数据已成功获取
谁能指导我在这里做错了什么?
提前致谢。
我必须使用的其余 api 提供多个端点上的数据。结果中的对象可能具有 api 无法直接解析的关系,而是提供指向实际资源的 id。
示例:
为了简单起见,假设一个Person可以拥有多个Books.
现在api/person/{i}端点返回:
{ id: 1, name: "Phil", books: [1, 5, 17, 31] }
Run Code Online (Sandbox Code Playgroud)
端点api/book/{i}返回此(请注意,作者可能又是一个关系):
{ id: 5, title: "SPRINT", author: 123 }
Run Code Online (Sandbox Code Playgroud)
有什么方法可以教 apollo 客户端以我可以编写以下(或类似)查询的方式解析这些端点:
query fetchBooksOfUser($id: ID) {
person (id: $id) {
name,
books {
title
}
}
}
Run Code Online (Sandbox Code Playgroud) 有什么方法可以更改 Apollo Server WS 的路径(server.subscriptionsPath)?
默认路径是“/graphql”。如何设置其他路由,例如“ws://localhost:3000/api”?
import express from 'express'
import http from 'http'
import { ApolloServer } from 'apollo-server-express'
const app = express()
// ...
const server = new ApolloServer({
typeDefs,
resolvers,
})
const httpServer = http.createServer(app)
server.installSubscriptionHandlers(httpServer)
console.log('server.graphqlPath', server.graphqlPath)
console.log('server.subscriptionsPath', server.subscriptionsPath)
httpServer.listen({ port:300 })
Run Code Online (Sandbox Code Playgroud) Apollo Server 文档仅提供了一种定义 GraphQL 模式 typeDef 的方法,即使用标签gql。但是,我看到了使用schema.gql文件的替代方法。
这些方法之一已经过时了吗?
使用其中一种方法有什么优点或缺点?
.gql尽管支持该文件类型,为什么 Apollo Server 文档没有提及该文件类型?
我正在尝试集成 apollo iOS 客户端,在完成所有步骤后,我在运行构建阶段脚本时收到错误。所以一共有三个错误。一个是
请注意,这是在node_modules/@oclif 内部发生的。
Error initializing Apollo GraphQL project "Unnamed Project": Error: Error in "Loading schema for Unnamed Project": TypeError: Cannot read property 'reduce' of undefined
我在 Express 上有 Apollo Graph 的后端。
在我的客户端 React 应用程序中,我下一步要做的是:
apollo codegen:generate --excludes=node_modules/* --includes=**/*.tsx --target typescript --tagName gql --outputFlat generate
Run Code Online (Sandbox Code Playgroud)
我等待生成文件夹,但此命令给出了下一个错误:
Error: There are multiple definitions for the herewas operation.
All operations in a project must have unique names.
If generating types, only the types for the first definition
found will be generated.at GraphQLClientProject.checkForDuplicateOperations
(....\node_modules\apollo\node_modules\apollo-language-server\lib\project\base.js:129:31)
.........
.........
Generating query files with 'typescript' target
> Apollo does not support anonymous operations
Run Code Online (Sandbox Code Playgroud)
我还有 apollo.config.js:
module.exports = {
client: {
service: {
url: "http://localhost:4000/graphql" …Run Code Online (Sandbox Code Playgroud) apollo ×10
graphql ×9
react-apollo ×4
javascript ×2
reactjs ×2
typescript ×2
apollo-ios ×1
graphql-js ×1
ios ×1
swift ×1
vue.js ×1
vuejs2 ×1
websocket ×1