我正在尝试将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阿波罗服务器的“设置”文件:
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;
}
}
答案 0 :(得分:1)
解决了该问题。
问题在于方法initalize(config)
在这种情况下是不必要的。
因此,要解决此问题,只需从代码中删除initalize方法
答案 1 :(得分:0)
我将其写为答案而不是评论,因为我没有足够的代表。
在tutorial on their official website中提到了这一点。
在克隆和运行时,它们的教程运行良好,但是当我使用覆盖initialize
来实现该教程时,该教程将无法正常工作。
但是,如果我不重写它,它将按您所说的那样工作。
我们做错了吗?还是他们的文档需要更新?因为context
上存在不正确的用户是一种严重的情况。