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

时间:2019-10-17 12:21:06

标签: javascript node.js graphql apollo-server

我正在尝试将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;
        }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我将其写为答案而不是评论,因为我没有足够的代表。 在tutorial on their official website中提到了这一点。 this is mentioned在克隆和运行时,它们的教程运行良好,但是当我使用覆盖initialize来实现该教程时,该教程将无法正常工作。 但是,如果我不重写它,它将按您所说的那样工作。 我们做错了吗?还是他们的文档需要更新?因为context上存在不正确的用户是一种严重的情况。