预期结果:
我正在尝试使用“setContext”函数异步设置令牌。
我期待在我的请求标题或其他地方找到设置在“setContext”中的令牌。
(请参阅如何重现问题的代码)。
实际结果:
该请求从不包含我的令牌或我发送的任何上下文。
也不以同步方式工作。
这是我得到的请求:
{ data: {},\n context: \n { request: { sourceIp: '110.169.68.32', headers: {}, httpMethod: 'post' },\n auth: null,\n sessionCache: {},\ N环境:{},\ n graphcool:\ N {rootToken: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTI5NzkxNzEsImlhdCI6MTUxMjk3ODg3MSwiY2xpZW50SWQiOiJfIiwicHJvamVjdElkIjoiY2o5dnAwMzloMTl2bjAxNDhlc3UzbnYzMSIsInBlcm1hbmVudEF1dGhUb2tlbklkIjoiY2piMXdrMHR2NGExNDAxNTRxMXBrMnh0diJ9.WcqQchOGD-BwwwM4Nmh0zYoOpPk7YcGk1qzRcutDxmY',\ n端点:本发明的课题,\ n专案编号: 'cj9vp039h19vn0148esu3nv31',\ n别名:空,\ n轻拍: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTI5NzkxNzEsImlhdCI6MTUxMjk3ODg3MSwiY2xpZW50SWQiOiJfIiwicHJvamVjdElkIjoiY2o5dnAwMzloMTl2bjAxNDhlc3UzbnYzMSIsInBlcm1hbmVudEF1dGhUb2tlbklkIjoiY2piMXdrMHR2NGExNDAxNTRxMXBrMnh0diJ9.WcqQchOGD-BwwwM4Nmh0zYoOpPk7YcGk1qzRcutDxmY',\ n服务Id: 'cj9vp039h19vn0148esu3nv31'}}}”
如何重现问题:
import ApolloClient from "apollo-client";
import { HttpLink } from "apollo-link-http";
import { ApolloLink, concat } from "apollo-link";
import { InMemoryCache } from "apollo-cache-inmemory";
import { setContext } from "apollo-link-context";
const authMiddleware = setContext(request => {
new Promise((success, fail) => {
AsyncStorage.getItem(ProjectSettings.graphcoolKey).then(token => {
success({
headers: {
authorization: 'Bearer ${token}'
}
});
});
});
});
const httpLink = new HttpLink({
uri: ProjectSettings.simpleGraphCoolEndPoint
});
const client = new ApolloClient({
link: concat(authMiddleware , httpLink),
cache: new InMemoryCache()
});
我尝试了很多不同的组合:
success({ token: 'async found token' })
success({ auth: 'async found token' })
success({ headers: { auth: 'async found token' }})
...
即使是最简单的方式也不会发送任何东西
const middleware = setContext((request, previousContext) => ({
authorization: '1234'
}))
您的重现步骤中至少有一个问题是您没有返回承诺,但这并不能解释为什么最简单的示例对您不起作用。
@imranolas 非常感谢,它解决了我的问题:)
对于这个简单的例子,我也不知道,但这可能是我的一个小错误。
实际上,我从https://github.com/apollographql/apollo-link/tree/master/packages/apollo-link-context复制/粘贴了代码并错误地添加了一些括号:/
谢谢@imranolas的帮助!
文档显示:
success({ token: "async found token" })
if (token) return { token };
{ headers: { authorization: "1234"} }
等等。
但只有
{ headers: { authorization: "1234"} }
对我有用。 我的意思是带有对象的header
字段必须是。 该对象将被映射到请求标头。
另一个例子是confising。 很可能它是伪代码,或者可能被认为具有特殊处理。 它令人困惑并且不节省时间。
最有用的评论
您的重现步骤中至少有一个问题是您没有返回承诺,但这并不能解释为什么最简单的示例对您不起作用。