Я пишу простое приложение с использованием шаблона репозитория, nodejs, graphql и sequelize. Во-первых вот моя основа хранилище:ES6: Использование класса в качестве модуля
import db from '../models';
export default class AbstractRepository {
constructor (model, include) {
if (new.target === AbstractRepository) {
throw new TypeError('Cannot construct AbstractRepository instances directly.');
}
this.model = model;
this.include = include;
}
static findAll() {
return db[this.model].findAll({ include: this.include });
}
}
Вот репозиторий, который расширяет его:
import db from '../models';
import AbstractRepository from './AbstractRepository';
class UserRepository extends AbstractRepository {
constructor() {
super('User', [db.Clickwrap]);
}
}
export default new UserRepository();
Наконец, здесь, где используется UserRespository (есть еще в этот файл, но это важно часть):
import UserRepository from '../../repositories/UserRepository';
const resolvers = {
Query: {
users (root, args, context) {
return UserRepository.findAll();
},
},
};
Когда я запускаю простой graphql запрос в graphiql так:
{
users {
id
}
}
Я получаю эту ошибку:
_UserRepository2.default.findAll is not a function
Не уверен, что я пропускаю, что причиной этого.
Редактировать
Я обновил свой код, чтобы он не экспортирует экземпляр больше. Все остальное не изменилось. Вот мой новый UserRepository файл:
import db from '../models';
import AbstractRepository from './AbstractRepository';
class UserRepository extends AbstractRepository {
constructor() {
super('User', [db.Clickwrap]);
}
}
export default UserRepository;
Теперь я получаю эту ошибку:
Cannot read property 'findAll' of undefined
Почему вы создали 'findAll' static? Это причина. – loganfsmyth
[Никогда не экспортируйте экземпляр класса!] (Http://stackoverflow.com/a/39079929/1048572) Экспортируйте сам класс. – Bergi
@ Bergi Никогда не говори никогда. Экспорт по умолчанию отличен, если требуется один сингл (не в этом случае). Это не означает, что класс не должен экспортироваться как именованный экспорт, по крайней мере, для тестирования. – estus