Apollo-link: [Bug] apollo-link-context "setContext" 不发送上下文

创建于 2017-12-11  ·  4评论  ·  资料来源: apollographql/apollo-link

预期结果:
我正在尝试使用“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'
}))

最有用的评论

您的重现步骤中至少有一个问题是您没有返回承诺,但这并不能解释为什么最简单的示例对您不起作用。

所有4条评论

您的重现步骤中至少有一个问题是您没有返回承诺,但这并不能解释为什么最简单的示例对您不起作用。

@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。 很可能它是伪代码,或者可能被认为具有特殊处理。 它令人困惑并且不节省时间。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

lobosan picture lobosan  ·  3评论

valerybugakov picture valerybugakov  ·  5评论

steffenmllr picture steffenmllr  ·  4评论

Morantron picture Morantron  ·  3评论

MoonTahoe picture MoonTahoe  ·  3评论