GraphQL:TypeError:无法读取未定义的属性

Posted

技术标签:

【中文标题】GraphQL:TypeError:无法读取未定义的属性【英文标题】:GraphQL: TypeError: Cannot read property of undefined 【发布时间】:2020-12-05 16:41:18 【问题描述】:

我有一个 Apollo GraphQL 项目,我在其中创建了自己的查询和突变。我已经使用了模拟数据并且查询和突变工作正常。但是当我尝试使用 Sequelize ORM 时,我收到了错误

"TypeError: Cannot read property 'getListings' of undefined",
            "    at listings (/home/ayman/Desktop/apollo-graphql/graphql-app/functions/graphql.js:50:19)",
            "    at field.resolve (/home/ayman/Desktop/apollo-graphql/graphql-app/node_modules/graphql-extensions/dist/index.js:134:26)"

graphql.js 中的查询和突变:

const  ApolloServer, gql = require("apollo-server-lambda");
const  Listing, User  = require("../db");
const jwt = require("jsonwebtoken");

const typeDefs = gql`
  type Query 
    listings: [Listing!]!
  
  type Mutation 
    createListing(input: CreateListingInput!): Listing!
  
  input CreateListingInput 
    title: String!
    description: String
    url: String!
    notes: String
  
  type Contact 
    id: ID!
    name: String!
    company: Company
    email: String
    notes: String
  
  type Company 
    id: ID!
    name: String!
    logo: String
    listings: [Listing!]!
    url: String
  
  type Listing 
    id: ID!
    title: String!
    description: String
    url: String!
    notes: String
    company: Company
    contacts: [Contact!]!
  
`;

const resolvers = 
  Query: 
    listings(_, __,  user ) 
      return user.getListings();
    ,
  ,
  Mutation: 
    createListing(_,  input ,  user ) 
      return Listing.create( ...input, userId: user.id );
    ,
  ,
;

const server = new ApolloServer(
  typeDefs,
  resolvers,
);

exports.handler = server.createHandler();

我有 Sequilize 和 Postgres 数据库:

db.js

const Sequelize = require("sequelize");

const sequelize = new Sequelize(process.env.DB_CONNECTION_STRING, 
  dialect: "pg",
  dialectModule: require('pg'),
  dialectOptions: 
    ssl: true,
  ,
);

class User extends Sequelize.Model 
User.init(
  
    email: Sequelize.STRING,
    password: Sequelize.STRING,
  ,
  
    sequelize,
    modelName: "user",
  
);

class Listing extends Sequelize.Model 
Listing.init(
  
    title: Sequelize.STRING,
    description: Sequelize.TEXT,
    url: Sequelize.STRING,
    notes: Sequelize.TEXT,
  ,
  
    sequelize,
    modelName: "listing",
  
);

Listing.belongsTo(User);
User.hasMany(Listing);

exports.sequelize = sequelize;
exports.User = User;
exports.Listing = Listing;

Github Link

    使用netlify dev运行

    转到网址:http://localhost:8888/.netlify/functions/graphql

    GraphQL 查询示例


 listings 
     id
     title
     description
     url
     company 
        name
        url
     
    

【问题讨论】:

你在哪里创建 context 对象? 我正在使用来自 db.jsuser 作为 Apollo 的 resolver 的一部分。 看起来您正在尝试使用解析器的第三个参数,即 context - apollographql.com/docs/apollo-server/data/resolvers/…,但您从未将 context 初始化函数添加到 ApolloServer构造函数。 【参考方案1】:

我明白了,您正在尝试从上下文访问用户对象。请检查上下文定义。它应该显式返回一个包含用户对象的对象。

【讨论】:

我该怎么做? 请查看配置Apollo服务器的代码。上下文作为 apollo 服务器配置的键传递。【参考方案2】:
return user.getListings();

你可能是指用户,因为用户是未定义的

【讨论】:

试过了,但报同样的错误。 return user.getListings(); 属于自定义 Apollo 解析器,用于从数据源获取详细信息。

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

初学者 GraphQL 和 Drupal - 静态查询返回 TypeError:无法读取未定义的属性“allNodeData”

Nativewscript-vue graphql:TypeError:无法读取未定义的属性“地图”

如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?

如何使用 Apollo Graphql 客户端和 React 解决“TypeError:无法读取未定义的属性“参数”?

TypeError:无法读取未定义的属性“棱镜”

React TypeError:无法读取未定义的属性“getBoundingClientRect”