无法读取未定义的属性“获取”

Posted

技术标签:

【中文标题】无法读取未定义的属性“获取”【英文标题】:Cannot read property 'fetch' of undefined 【发布时间】:2020-02-14 08:52:52 【问题描述】:

我正在尝试将 REST 数据源添加到我的 Apollo 服务器。 我创建了一个扩展 RESTDataSource 的类,其中包含所有 API 请求。 当尝试从我的 GraphQL 解析器代码调用登录方法时,会引发错误

我该如何解决这个问题?

我已经尝试过: 在 API 类构造函数中绑定 login 和 fetch 方法

this.login = this.login.bind(this); this.fetch = this.fetch.bind(this);

从构造函数调用登录方法

RESTDataSource 类

class API extends RESTDataSource 
        constructor() 
            super();
            this.baseURL = URL;

            this.login = this.login.bind(this);
            this.fetch = this.fetch.bind(this);
            console.log(this.fetch);
            console.log(this.login);

        
        initialize(config) 
            //config can store different information
            //the current user can be stored in config.context for easy  access
            this.context = config.context;

        

        async login(username, password) 
            return this.post(`/`, 
                "id": 1
            , 
                "method": "authenticate"
            , 
                params: 
                    "user": username,
                    "password": password
                ,
                "jsonrpc": "2.0"
            )
        
    

这是 index.js apollo 服务器的“设置”文件:

const server = new ApolloServer(
    typeDefs,
    resolvers,
    dataSources: () => 
        return 
            managementDatabase: new ManagementDatabase(),
            API: new API() //was previously imported
        
    
);




server.listen().then((
    url
) => 
    log(`????  Server ready at $url`)
)

GraphQL 的解析器文件:

Query: 
        lessons: async (_source, _args, 
            dataSources
        ) => 
            const data = await dataSources.webuntisAPI.login(process.env.USER, process.env.PW);
            console.log(data);
            return data;
        

【问题讨论】:

console.log(this.fetch); 在控制台中显示什么? 输出为:[Function: bound fetch] 哪个文件和行号抛出这个错误? @kmoser 错误在node_modules\\apollo-datasource-rest\\dist\\RESTDataSource.js:158:63)。我还注意到我们在 API 类中打印了this。有一个名为httpFetch 的属性未定义。查看restdatasource.js 文件时,抛出错误const response = yield this.httpCache.fetch(request, .. 的行使用this.httpCache,它是在构造函数中这样创建的:this.httpCache = new HTTPCache_1.HTTPCache(config.cache, this.httpFetch) 使用httpFetch(我猜)是未定义的。但我不知道为什么 【参考方案1】:

我写这篇文章是为了回答而不是评论,因为我没有足够的代表来做这件事。 在tutorial on their official website 中提到了这一点。 他们的教程在克隆和运行时运行良好,但是当我通过覆盖 initialize 来实现它时同样不起作用。 但是,如果我不覆盖它,它就像你提到的那样工作。 我们做错了吗?或者他们的文档需要更新?因为context 上出现的错误用户是一个严重的案例。

【讨论】:

【参考方案2】:

解决了这个问题。 问题是方法initalize(config) 在这种情况下是不必要的。 所以要解决这个问题,只需从代码中删除 initalize 方法

【讨论】:

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

无法读取未定义的属性“参数” - 无法获取产品 ID

使用Angular 7获取“无法读取未定义的属性'http'”

获取未捕获的类型错误:无法读取未定义的属性“toLowerCase”[关闭]

TypeError:无法读取未定义的 guild.roles 的属性“获取”

使用 $http 时无法读取未定义的属性“获取”[重复]

无法读取未定义的属性“获取”