Next.js useQuery存在奇怪的问题:未读取查询参数

Next.js useQuery存在奇怪的问题:未读取查询参数,next.js,apollo-client,Next.js,Apollo Client,我有一个组件,它在参数化查询中将字符串(userToFetch)作为变量参数传递给它。该组件如下所示: // pages/index.jsx import React from 'react'; import { useQuery } from '@apollo/react-hooks'; import gql from 'graphql-tag'; const GET_USERS = gql` query users ($limit: Int!, $username: String!)

我有一个组件,它在参数化查询中将字符串(
userToFetch
)作为变量参数传递给它。该组件如下所示:

// pages/index.jsx

import React from 'react';
import { useQuery } from '@apollo/react-hooks';
import gql from 'graphql-tag';

const GET_USERS = gql`
  query users ($limit: Int!, $username: String!) {
    users (limit: $limit, where: { username: $username }) {
      username
      firstName
    }
  }
`;

const Home = () => {
  const userToFetch = 'jonsnow';

  const {
    loading,
    error,
    data,
  } = useQuery(
    GET_USERS,
    {
      variables: { limit: 2, username: userToFetch },
      notifyOnNetworkStatusChange: true,
    },
  );

  if (loading) {
    return <p>Loading...</p>;
  }

  if (error) {
    return <p>Error: {JSON.stringify(error)}</p>;
  }
  return (
    <div>
      <ul>
        {data.users.map(user => {
          return <li>{user.username} {user.firstName}</li>;
        })}
      </ul>
    </div>
  );
};

export default Home;
数据库是以下
用户的集合

"users": [
      {
        "username": "negger",
        "firstName": "Arnold",
        "lastName": "Schwarzenegger"
      },
      {
        "username": "jonsnow",
        "firstName": "Jon",
        "lastName": "Snow"
      },
      {
        "username": "tonystark",
        "firstName": "Tony",
        "lastName": "Stark"
      }
    ]
  }
现在,虽然这应该可以工作了(当我在graphql中运行查询时就可以了),但代码运行时就好像
where
子句不存在一样!它只返回所有结果,就好像正在运行的查询是:

users {
  _id
  username
  firstName
}
要复制此问题,请访问。页面应该显示一个列表,其中只有一个元素由匹配的用户名名值组成:
jonsnow-Jon
,但它返回两个条目,
negger-Arnold
jonsnow-Jon
(分别指定
limit
,但完全忽略
where
)。现在,使用
jonsow
作为
where
中的参数运行相同的查询:

结果将与预期完全一致:

{
  "data": {
    "users": [
      {
        "_id": "5d9f261678a32159e61018fc",
        "username": "jonsnow",
        "firstName": "Jon",
      }
    ]
  }
}
我忽略了什么

p.S.:回购协议可供参考

更新:为了追踪根本原因,我尝试在
apollo client.js中记录一些值:

console.log('initialState', initialState);
奇怪的是,输出显示了正确的查询以及传递的变量,但结果错误:

...
ROOT_QUERY.users({"limit":2,"where":{"username":"jonsnow"}}).0:
  firstName: "Arnold"
  username: "negger"
  __typename: "UsersPermissionsUser"
...
更新:以下是我的Apollo客户端开发工具的结果截图:


由Strapi生成的模式为where属性提供了一个JSON类型,因此您必须将查询变量中的整个where部分作为JSON传递,因为没有注入变量

# Write your query or mutation here
query users($where: JSON) {
  users(where: $where) {
    username
    firstName
  }
}
这些变量看起来像:

{"where": {"username": "jonsnow"}}

这真是个奇怪的问题。无论如何,您的整个查询都应该爆炸,因为您没有传入
$postLimit
$postStart
——这让我觉得在加载程序运行时,webpack或其他东西正在缓存查询。也许你可以清除缓存目录?可能与你看到的bug无关,但是如果你已经在使用
babel plugin import graphql
,您不需要将导入的查询包装到
gql
——它应该已经是DocumentNode对象。您从哪里获得
$postLimit
$postStart
?我曾经有过这些,但为了缩小问题范围,我从发布的查询中删除了它们。此外,如果这是由于服务器上缓存了任何内容,那么在实例重新启动和代码重新编译后,缓存应该被刷新并解决问题,不是吗?我想我在翻阅回购协议时看到了这些争论——也许我在看另一份文件?
# Write your query or mutation here
query users($where: JSON) {
  users(where: $where) {
    username
    firstName
  }
}
{"where": {"username": "jonsnow"}}