在 apollo (graphql) 查询中无法识别 FlowRouter

Posted

技术标签:

【中文标题】在 apollo (graphql) 查询中无法识别 FlowRouter【英文标题】:FlowRouter is not recognized inside of an apollo (graphql) query 【发布时间】:2017-04-16 09:32:16 【问题描述】:

我在使用 react-apolloFlowRouter 时遇到问题(在 meteor 项目中)。这是我的graphql 查询(它应该每 5 秒更新一次):

@graphql(myQuery, 
  options: 
    pollInterval: 5000,
    variables: 
      userId: FlowRouter.getQueryParam('r'),
      registerToken: FlowRouter.getQueryParam('registerToken')
    
  ,
)
export const default class MyComponent;

如果我对 userIdregisterToken 参数进行硬编码,查询就可以正常工作。 所以我想这里的问题是这些FlowRouter.getQueryParam() 函数返回undefined(即使我在客户端)。如果我在MyComponent 或浏览器控制台中调用它们,它们会很好地工作。

【问题讨论】:

【参考方案1】:

此代码是否在页面加载时运行?我不明白为什么,但也许getQueryParam 在页面加载时总是未定义? (或者你可以解析location.href

如果是这样,它是响应式的,所以你可以等到它有一个值,然后开始查询:

Tracker.autorun(c =>
  if (FlowRouter.getQueryParam('r')) 
    // do query
    c.stop()
  
)

【讨论】:

【参考方案2】:

根据 Loren 的回答,我省略了 FlowRouter.getQueryParam() 函数并改用纯 javascript(复制自 this SO question):

function getParameterByName(name, url) 
    if (!url) 
      url = window.location.href;
    
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));

用法

// query string: ?foo=lorem&bar=&baz
var foo = getParameterByName('foo'); // "lorem"
var bar = getParameterByName('bar'); // "" (present with empty value)
var baz = getParameterByName('baz'); // "" (present with no value)
var qux = getParameterByName('qux'); // null (absent)

现在一切正常!

【讨论】:

以上是关于在 apollo (graphql) 查询中无法识别 FlowRouter的主要内容,如果未能解决你的问题,请参考以下文章

无法在单个 GraphQL 查询中组合本地和远程数据(Next.js + Apollo)

无法在 Apollo GraphQL 的查询中使用 @client @export 变量

从 ruby​​ gem 导出的 GraphQL 查询无法在 Xcode 项目上使用 Apollo 进行编译

无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端

Apollo GraphQL 变量查询

vue apollo 4 不返回 graphql 查询结果