JS: смешивание двух классов - PullRequest
0 голосов
/ 12 июня 2019

Используя Сервер Apollo , достаточно стандартная настройка:

В index.js файле, который управляет состоянием моего сервера Apollo:

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 файл становится немного длинным, отчасти потому, что он управляет слоем БД для многих типов, поэтому я подумал о том, как его реорганизовать.

Я хочу разбить его на основные типы, используя шаблон хранилища , что-то вроде:

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 файле?

1 Ответ

0 голосов
/ 12 июня 2019

Вместо одного RESTDataSource для конечной точки, которую вы упаковываете, вы можете разделить ее на несколько RESTDataSource экземпляров, по одному на ресурс. Например, https://swapi.co/api можно разделить на 6 разностей RESTDataSource экземпляров со следующими baseURL s:

И ваш конфиг будет выглядеть примерно так:

dataSources: () => ({
  people: new PeopleAPI(),
  films: new FilmsAPI(),
  starships: new StarshipsAPI(),
  vehicles: new VehiclesAPI(),
  species: new SpeciesAPI(),
  planets: new PlanetsAPI(),
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...