2017-01-17 6 views
0

Я пишу простое приложение с использованием шаблона репозитория, 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 
+2

Почему вы создали 'findAll' static? Это причина. – loganfsmyth

+0

[Никогда не экспортируйте экземпляр класса!] (Http://stackoverflow.com/a/39079929/1048572) Экспортируйте сам класс. – Bergi

+0

@ Bergi Никогда не говори никогда. Экспорт по умолчанию отличен, если требуется один сингл (не в этом случае). Это не означает, что класс не должен экспортироваться как именованный экспорт, по крайней мере, для тестирования. – estus

ответ

0

Как я уже говорил в комментариях выше, я собирался об этом неправильном пути. Как только я сделал, как предложил, и экспортировал класс вместо экземпляра класса, я получил неопределенную ошибку, которая, как я думал, означала, что UserRepository не был определен в моем файле user.js. Однако ошибка была в моем методе findAll() в моем AbstractRepository, потому что this.model никогда не настраивался, потому что я пытался делать все со статикой, поэтому никогда не вызывал конструктор. Поэтому я отказался от статической бессмыслицы и создал экземпляр моего UserRepository. Таким образом, UserRepository выглядит так, как в части редактирования моего оригинального сообщения.Однако AbstractRepository теперь выглядит следующим образом:

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; 
    } 
    findAll() { 
    return db[this.model].findAll({ include: this.include }); 
    } 
} 

И мой файл user.js выглядит следующим образом:

import UserRepository from '../../repositories/UserRepository'; 

const userRepo = new UserRepository(); 
const resolvers = { 
    Query: { 
    users (root, args, context) { 
     return userRepo.findAll(); 
    }, 
    }, 
}; 

Теперь все работает отлично. Спасибо, что помогли мне в правильном направлении.

2

Статические функции не отозваны на экземпляры класса. См. Последний пример на MDN documentation on static.

В коде, вы экспортируете экземпляр UserRepository:

export default new UserRepository(); 

который вы импортировать позже с тем же именем, что и имя класса:

import UserRepository from '../../repositories/UserRepository'; 

Теперь, когда вы делаете UserRepository.findAll(), вы вызываете функцию findAll на экземпляр класса UserRepository. Вы импортировали этот экземпляр с тем же именем, что и имя класса. Вы на самом деле не ссылаетесь на статическую функцию findAll на класс. Вместо этого вы делаете это на экземпляре.

Как Берги уже предлагали, просто экспортировать класс:

export default UserRepository; 
+0

Это устранит ошибку, но 'findAll()' будет терпеть неудачу. – zeroflagL

+0

Я сделал, как предложил Берги, и теперь, поскольку @zeroflagL говорит, что все еще не удается, просто с другой ошибкой. Дополнительную информацию см. В обновленном сообщении выше. Спасибо за вклад до сих пор. – LoneWolfPR

 Смежные вопросы

  • Нет связанных вопросов^_^