无法读取未定义的属性“获取”
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 方法
【讨论】:
以上是关于无法读取未定义的属性“获取”的主要内容,如果未能解决你的问题,请参考以下文章
使用Angular 7获取“无法读取未定义的属性'http'”
获取未捕获的类型错误:无法读取未定义的属性“toLowerCase”[关闭]