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

g2ieeal7  于 2023-01-24  发布在  Java
关注(0)|答案(3)|浏览(176)

我正在尝试将REST数据源添加到Apollo Server。我创建了一个类来扩展包含所有API请求的RESTDataSource。当尝试从我的GraphQL解析器代码调用登录方法时,抛出错误
我该怎么补救呢?
我已经试过了在API类构造函数中绑定登录和获取方法
这个.登录=这个.登录.绑定(这个);获取=获取绑定(this);
从构造函数调用login方法
REST数据源类

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;
        }
}
b4qexyjb

b4qexyjb1#

已解决问题。问题出在initalize(config)方法上,该方法在本例中是不必要的。因此,要解决此问题,只需从代码中删除initalize方法

laik7k3q

laik7k3q2#

我写这个是作为一个答案而不是评论,因为我没有足够的代表。在tutorial on their official website中,这是提到。

他们的教程运行良好,当克隆和运行,但同样的是,当我实现它与覆盖initialize不工作。然而,如果我不覆盖它,就像你提到的那样。我们做错了吗?或者他们的文档需要更新吗?因为context上出现不正确的用户是一个严重的问题。

w8ntj3qf

w8ntj3qf3#

我通过从apollo-datasource-rest添加http缓存解决了这个问题

import { HTTPCache, RESTDataSource } from "apollo-datasource-rest";

@DataSourceService()
export class MyDataSource extends RESTDataSource {
  constructor() {
    super();

    this.httpCache = new HTTPCache(); // <---- This
    this.baseURL = "http://localhost:8080";
  }

相关问题