使用Apollo server,进行标准设置:
在管理我的Apollo服务器状态的index.js
文件中:
const { ApolloServer } = require('apollo-server-express');
const databaseAPI = require('../database/database.datasource');
...
module.exports = new ApolloServer({
...
dataSources: () => {
return {
databaseAPI: new databaseAPI()
};
},
...
});
然后是我的database.datasource.js
文件:
const { RESTDataSource } = require("apollo-datasource-rest");
// imports and config here
class databaseAPI extends RESTDataSource {
constructor() {
super();
}
// methods here like createUser({email, password, name})
}
module.exports = databaseAPI;
这个database.datasource.js
文件有点长,部分是因为它正在管理许多类型的db层,所以我在考虑如何重构它。
我想使用repository pattern按主要类型将其分解,例如:
UserRepository.js
(以及类似的抽象类作为参考,并用于强制使用内部API)
class UserRepository {
createUser({ email, password, name }) {
throw new Error("Not implemented");
}
...
}
export default UserRepository;
,然后在按类型的目录中实现这些实现:
/UserRepository/db.datasource.js
import UserRepository from "../UserRepository";
import utils from './utils';
class UserDatabaseAPI extends UserRepository {
constructor(db) {
super();
this.db = db;
}
createUser({ email, password, name }) {
// logic here
}
}
export default UserDatabaseAPI;
我的问题是如何最好地管理具有多个继承源的根database.datasource.js
文件中的多个类。
我可以看到这样做:
const { RESTDataSource } = require("apollo-datasource-rest");
const UserDatabaseAPI = require("./UserRepository/db.datasource.js");
// imports and config here, including a db instance
const userDBAPI = new UserDatabaseAPI(db);
class databaseAPI extends RESTDataSource {
constructor() {
super();
}
createUser = userDBAPI.createUser;
...
}
尽管我认为这可能会让人头疼。是否有另一种方法在这里可能会更好,还是至少有一种方法可以更好地将我的userDBAPI
实例中的方法映射到我的根database.datasource.js
文件中的方法?
答案 0 :(得分:0)
您不必为要包装的端点使用单个RESTDataSource
,而是可以将其拆分为多个RESTDataSource
实例,每个资源一个。例如,https://swapi.co/api
可以分为6个具有以下RESTDataSource
的差异baseURL
实例:
您的配置如下所示:
dataSources: () => ({
people: new PeopleAPI(),
films: new FilmsAPI(),
starships: new StarshipsAPI(),
vehicles: new VehiclesAPI(),
species: new SpeciesAPI(),
planets: new PlanetsAPI(),
})