React:: 错误:GraphQL 错误:无法读取未定义的属性“标题”

Posted

技术标签:

【中文标题】React:: 错误:GraphQL 错误:无法读取未定义的属性“标题”【英文标题】:React:: Error: GraphQL error: Cannot read property 'headers' of undefined 【发布时间】:2020-07-25 19:54:27 【问题描述】:

我在 netlify 上部署了我的应用程序。

在本地服务器上,我可以发表评论。

但在生产模式下,

“错误:GraphQL 错误:无法读取未定义的属性 'headers'” 当我提交评论时出现。

我尝试了很多方法来解决这个问题,但我无法解决它。

我认为问题在于我在 Heroku 上的 GraphQL 服务器。

check-auth.js

const  AuthenticationError  = require('apollo-server');

const jwt = require('jsonwebtoken');
const  SECRET_KEY  = require('../config');

module.exports = (context) => 
  // context =  ... headers 
  const authHeader = context.req.headers.authorization;

  if (authHeader) 
    // Bearer ....
    const token = req.headers.authorization || '';
   //I tried. const token = req.headers["authorization"];
    if (token) 
      try 
        const user = jwt.verify(token, SECRET_KEY);
        return user;
       catch (err) 
        throw new AuthenticationError('Invalid/Expired token');
      
    
    throw new Error("Authentication token must be 'Bearer [token]");
  
  throw new Error('Authorization header must be provided');
;

只有登录用户才能发表评论。

用户登录后,我的用户 ID 存储在本地服务器中。 关键是 jwtToken。

【问题讨论】:

【参考方案1】:

这是一个错字还是您在获取令牌时实际上错过了上下文对象?

const token = context.req.headers.authorization || ''; 

检查您的代码中的上述行,当您已经在 authHeader 常量中拥有它时,为什么您甚至需要它。

理想情况下,您的令牌将位于 context.req.headers['x-token'] 或 req.headers['token'] 取决于您的传递方式。

【讨论】:

【参考方案2】:

问题可能在于您在 Apollo 服务器中转发请求对象的方式。确保它是这样的:

const server = new ApolloServer(
  typeDefs,
  resolvers,
  context: ( req ) => (req),  // LIKE THIS
  context: ( req ) => req,      // NOT LIKE THIS, Results in undefined req
);

【讨论】:

以上是关于React:: 错误:GraphQL 错误:无法读取未定义的属性“标题”的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 钩子处理 graphQL 突变错误(useMutation + Apollo-client)

尝试使用 React Apollo Query 组件进行 GraphQL 查询,打字稿导致错误

无法使用 graphql-middleware-sentry 从 GraphQL 接收错误

React + Apollo:GraphQL 错误数组未传递到组件中

graphql_devise 用于 Rails/Graphql/Apollo/React 中的身份验证。 “字段需要身份验证”错误

如何使用 React-Apollo 处理 GraphQL 错误?