所有文档和教程通常都会显示如下所示的简单突变示例:
extend type Mutation {
edit(postId: String): String
}
Run Code Online (Sandbox Code Playgroud)
但是这种edit方法必须在所有实体中都是唯一的,在我看来,这似乎不是一种非常健壮的写东西方式。我想描述与我们描述查询类似的突变,如下所示:
type PostMutation {
edit(postId: String): String
}
extend type Mutation {
post: PostMutation
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个有效的模式(它可以编译,我可以看到它反映在生成的 graph-i-ql 文档中)。但是我找不到让解析器使用此架构的方法。
这是 GraphQL 支持的案例吗?
有没有人在Content-Type使用设置标题时遇到问题apollo-datasource-rest?我正在尝试编码application/x-www-form-urlencoded,但我的 REST API 仍然没有看到参数:
class AuthAPI extends RESTDataSource {
...
willSendRequest( request ) {
request.headers.set( 'X-API-KEY', this.apiKey )
request.headers.set( 'Content-Type', 'application/x-www-form-urlencoded')
console.log( request.headers )
console.log( request.body )
}
async getToken( params ) {
return this
.post( apiEndpoints.auth.token, params )
.catch( err => handleError( err ))
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
// console.log( request.headers )
Headers {
[Symbol(map)]: [Object: null prototype] {
'X-API-KEY': [ '1234567890...' ],
'Content-Type': [ 'application/x-www-form-urlencoded' ]
}
}
// console.log( request.body )
{ …Run Code Online (Sandbox Code Playgroud) 我正在学习 GraphQL,一个基本点让我感到困惑。我知道有一个简单的解释,但我找不到。具体来说,来自 Apollo 文档( https://www.apollographql.com/docs/apollo-server/essentials/data.html#operation):
...命名操作以便在调试期间快速识别操作或将类似操作聚合在一起是有意义的...可以通过在查询或突变关键字后放置标识符来命名操作,就像我们在这里对 HomeBookListing 所做的那样:
query HomeBookListing {
getBooks {
title
}
}
Run Code Online (Sandbox Code Playgroud)
如果 HomeBookListing是查询的名称,那么是getBooks什么?解析器的名称?
同样,当你将变量传递给查询时,为什么会有“两级”参数,像这样
mutation HomeQuickAddBook($title: String, $author: String = "Anonymous") {
addBook(title: $title, author: $author) {
title
}
}
Run Code Online (Sandbox Code Playgroud)
那么,会 $title: String, $author: String = "Anonymous"变量会传递给查询,而title: $title, author: $author变量会传递给解析器吗?
我当然可以记住这个模式,但我很想从概念上理解不同的部分在这里做了什么。非常感谢任何见解!
我正在使用nuxtwithapollo-module并且我需要拦截可能的网络错误(401/403 更具体),以便我可以显示一些错误模式并注销我的用户。在文档中,我看到在里面nuxt.config.js你可以这样做:
apollo: {
tokenName: 'Authorization',
authenticationType: 'Bearer',
errorHandler(error) { do something }
}
...
Run Code Online (Sandbox Code Playgroud)
但是在该配置文件中,我无法访问我需要的应用程序功能(例如错误模式或我的路由器)。有什么办法可以存档吗?
我在 ReactJS 中使用 Apollo Client 与 GraphQL API 进行通信。我们使用 Firebase 身份验证和 JWT 来确保我们的 API 不会向公众公开私有数据,但问题是 firebase 令牌每隔一小时左右就会过期。
当用户登录并在请求标头上使用它时,我目前正在保存 IdToken localstorage 但是当令牌过期时,graphql 返回非授权错误。我还尝试在 apollo 的 createHttpLink 函数上使用 customfetch
const customFetch = async (uri, options) => {
console.log(firebase.auth.currentUser)
if (firebase.auth.currentUser) {
const token = await firebase.auth.currentUser.getIdToken()
localStorage.setItem('token', token)
options.headers.authorization = token;
return fetch(uri, options);
}
else {
firebase.auth.onAuthStateChanged(async (user) => {
if (user) {
console.log('Inside on Auth')
const token = await user.getIdToken()
localStorage.setItem('token', token)
options.headers.authorization = token;
return fetch(uri, options);
}
}) …Run Code Online (Sandbox Code Playgroud) firebase apollo reactjs firebase-authentication react-apollo
我想禁用缓存或将缓存限制为 24 小时。我的 ApolloClient 只在服务器端运行。
我的环境:
现在,这就是我配置我的ApolloClient.
new ApolloClient({
ssrMode: true,
cache: new InMemoryCache(),
link: WithApollo.BatchLink(),
credentials: 'same-origin',
});
Run Code Online (Sandbox Code Playgroud)
我在文档中看到的最接近的事情是FetchOptions......但它没有指定我实际上可以传递哪些选项来实现我禁用或限制缓存的需要。
我正在尝试新的 Apollo React Hooks,并建立了一个小型商业示例。
function App() {
const [cartId, setCartId] = useState('V1bvif5UxQThb84iukrxHx9dYQg9nr8j');
const [removeItem, {loading: mutationLoading}] = useMutation(REMOVE_ITEM, {
refetchQueries: [{query: CART_DETAILS, variables: {cartId}}]
});
const [addToCart] = useMutation(ADD_TO_CART, {
refetchQueries: [{query: CART_DETAILS, variables: {cartId}}]
});
const {data, loading, error} = useQuery(CART_DETAILS, {
variables: {cartId}
});
if (data && data.items) {
console.log(`We have data`, data);
}
const handleRemove = itemId => {
console.log(`Removing item with id ${itemId}`);
removeItem({
variables: {cartId, itemId}
});
};
if (error) {
console.log(`Some error happened`, error); …Run Code Online (Sandbox Code Playgroud) 根据有关本地状态管理的文档,可以同时使用writeData和writeQuery将数据附加到缓存。
这里的最佳做法是什么?什么时候一个?
我正在努力理解如何最好地组织我的代码以在 React 中设置初始 useState(),同时使用 GraphQL 和 Apollo 引入数据。这是我的代码。如您所见,我想查看“数据”的一部分来设置初始状态,但是当我将 setSTate 移到加载和错误行下方时,出现以下错误:
React Hook "useState" 被有条件地调用。在每个组件渲染中,必须以完全相同的顺序调用 React Hooks。您是否在提前返回后不小心调用了 React Hook?反应钩子/钩子规则
我应该如何更好地组织这个?我是否必须使用 Apollo 的状态管理库,因为我更喜欢使用 React useState hooks。
const GET_LATEST_POSTS = gql`
query {
"graphql query is in here"
}
Run Code Online (Sandbox Code Playgroud)
...
const Slider = () => {
const { data, loading, error } = useQuery(GET_LATEST_POSTS)
if (loading) return 'Loading...'
if (error) return `Error! ${error.message}`
const [ currentMovie, setMovie ] = useState(data)
}
Run Code Online (Sandbox Code Playgroud) 我在 angular 10 中使用 apollo,运行后出现此问题 ng serve
目标入口点“apollo-angular”中的错误缺少依赖项:
- @角度/核心
- 阿波罗客户端
- rxjs
- rxjs/运营商
- 阿波罗链接
是否有一个命令可以在我的项目中安装所有这些缺失的依赖项……尽管我认为我已经安装了所有这些……奇怪的是我有这些错误。有人能给我一些智慧吗,提前谢谢你
apollo ×10
graphql ×5
javascript ×2
react-apollo ×2
reactjs ×2
angular ×1
firebase ×1
node.js ×1
nuxt.js ×1
post ×1
react-hooks ×1
vue-apollo ×1
vue.js ×1