AWS Amplify 和 Next.JS with GraphQL Server Error No current user from getStaticPaths

Posted

技术标签:

【中文标题】AWS Amplify 和 Next.JS with GraphQL Server Error No current user from getStaticPaths【英文标题】:AWS Amplify and Next.JS with GraphQL Server Error No current user from getStaticPaths 【发布时间】:2021-10-13 18:02:43 【问题描述】:

我无法从 Amplify 的 API Graphql 访问数据,并且一直返回

Server Error
Error: No current user

我一直在关注这个教程:https://youtu.be/13nYLmjZ0Ys?t=2292

我知道我已登录 Amplify,因为如果我进入不同的页面,我可以获取用户身份验证,甚至可以显示 SignOut 按钮。但无论出于何种原因,我不确定为什么会出现此错误

import  API  from "aws-amplify";
import  useRouter  from "next/router";
import  listActivations, getActivation  from "../../graphql/queries";

const Activation = ( activation ) => 
  const router = useRouter();
  if (router.isFallback) 
    return <div>Loading</div>;
  
  return <div>activation.title</div>;
;
export default Activation;

export async function getStaticPaths() 
  const s-s-r = withs-s-rContext();
  console.log("static paths");
  const activationData = await s-s-r.API.graphql(
    query: listActivations,
  );
  console.log("activationData", activationData);
  const paths = activationData.data.listActivations.items.map((activation) => (
    params:  id: activation.id ,
  ));
  return 
    paths,
    fallback: true,
  ;


export async function getStaticProps( params ) 
  const s-s-r = withs-s-rContext(); // added s-s-r, but still getting error
  console.log("static props");
  const  id  = params;
  const activationData = await s-s-r.API.graphql(
    query: getActivation,
    variables:  id ,
  );
  return 
    props: 
      activation: activationData.data.getActivation,
    ,
  ;

出现控制台日志static paths,然后出现错误。

您认为这与我的 GraphQL 架构有关吗?

type User @model @auth(rules: [ allow: owner, ownerField: "username" ]) 
  id: ID!
  username: String!
  email: String!
  userType: UserType


type Activation
  @model
  @key(
    name: "activationsByStudentId"
    fields: ["student"]
    queryField: "activationsByStudentId"
  )
  @auth(
    rules: [
       allow: groups, groups: ["Admin"] 
       allow: owner 
      
        allow: owner
        ownerField: "studentId"
        operations: [create, update, delete]
      
       allow: private, operations: [read] 
       allow: public, operations: [read] 
    ]
  ) 
  id: ID!
  studentId: ID!
  title: String!
  student: Student @connection(fields: ["studentId"])
  teachers: [TeachersActivations] @connection(name: "ActivationTeachers")

编辑:我还添加了用户模型,看看这是否也是一个原因。

【问题讨论】:

我不熟悉 Amplify。无论如何,getStaticProps 与静态生成一起使用,即。它在构建时调用。您可以在运行时登录 Amplify,但不会影响任何静态数据获取。 @Riwen 当然可以,但是“没有当前用户”是什么意思?我什至正在学习 Amplify 本身的教程:docs.amplify.aws/start/getting-started/data-model/q/integration/… 【参考方案1】:

由于getStaticPropsgetStaticPaths 在构建期间被调用,并且在服务器上当fallback 等于true 时,您需要为s-s-r(服务器端渲染)配置Amplify。请务必查看s-s-r Support for AWS Amplify javascript Libraries。

解决方案:首先,为 s-s-r 配置 Amplify:

Amplify.configure( ...awsExports, s-s-r: true );

然后你需要使用withs-s-rContext,并添加authMode参数。正如上面的链接所引用的:

例如,采用由身份提供商(如 Amazon Cognito 用户池、Okto 或 Auth0)支持的 AppSync GraphQL API。某些 GraphQL 类型可能需要对用户进行身份验证才能执行某些请求。使用 API 类,用户身份现在将自动配置并传递到 API 请求标头中:

const s-s-r = withs-s-rContext();
const activationData = await s-s-r.API.graphql(
  query: listActivations,
  authMode: "AMAZON_COGNITO_USER_POOLS"
);

【讨论】:

哎呀,我实际上在我的代码库中添加了它,我只是没有在我的问题上更新它。但即使使用 s-s-r,我也遇到了问题 请务必更新问题中的代码。 您是否为 s-s-r 配置了 Amplify,即。 Amplify.configure( ...awsExports, s-s-r: true );? 是的,我的_app.js有它 更新了答案。【参考方案2】:

不过,我还是不明白为什么这不起作用,所以我决定将我的查询移到客户端

const [activation, setActivation] = useState(null);

const router = useRouter();
const  aid  = router.query;

useEffect(() => 
  if (!aid) return;

  async function activationDataFromClient() 
    try 
      const getActivationData = await API.graphql(
        query: getActivation,
        variables: 
          id: aid,
        ,
      );

      setActivation(getActivationData.data.getActivation);
     catch (err) 
      console.log("error fetching activation data: ", err);
    
  
  activationDataFromClient();
, [aid]);

【讨论】:

以上是关于AWS Amplify 和 Next.JS with GraphQL Server Error No current user from getStaticPaths的主要内容,如果未能解决你的问题,请参考以下文章

NextJS 与 Aws Amplify 部署错误

AWS Amplify GraphQL 使用多个输入参数获取数据

AWS Amplify DataStore 与存在于数组中的过滤器

AWS Amplify Graphql 创建一个新的用户表,有必要吗?

aws-amplify-react 和 @aws-amplify/ui-react 有啥区别?

AWS Amplify and React - 找不到模块:无法解析“@aws-amplify/analytics”