ES6:使用类作为模块

时间:2017-01-17 22:32:57

标签: javascript ecmascript-6 sequelize.js graphql

我正在使用存储库模式,nodejs,graphql和sequelize编写一个简单的应用程序。首先是我的基础存储库:

CountingInputStream.getCount()

这是一个扩展它的存储库:

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

最后,这里是使用UserRespository的地方(此文件还有更多内容,但这是重要部分):

import db from '../models';
import AbstractRepository from './AbstractRepository';

class UserRepository extends AbstractRepository {
  constructor () {
    super('User', [db.Clickwrap]);
  }
}

export default new UserRepository();

当我在graphiql中运行这样一个简单的graphql查询时:

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

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

我收到此错误:

{
  users {
    id
  }
}

不确定我错过的原因是什么。

修改

我已经更新了我的代码,因此它不再导出实例了。其他一切都保持不变。这是我的新UserRepository文件:

_UserRepository2.default.findAll is not a function

现在我收到了这个错误:

import db from '../models';
import AbstractRepository from './AbstractRepository';

class UserRepository extends AbstractRepository {
  constructor () {
    super('User', [db.Clickwrap]);
  }
}

export default UserRepository;

2 个答案:

答案 0 :(得分:2)

静态函数在类的实例上不可调用。请参阅MDN documentation on static上的最后一个示例。

在您的代码中,您要导出UserRepository的实例:

export default new UserRepository();

稍后导入的名称与类名相同:

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

现在,当您执行UserRepository.findAll()时,您正在findAll类的实例上调用UserRepository函数。您导入了与类名同名的实例。你实际上并没有在类上调用静态函数findAll。相反,你是在一个实例上做的。

正如Bergi已经建议的那样,只需导出该类:

export default UserRepository;

答案 1 :(得分: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();
    },
  },
};

现在一切都很好。感谢大家指导我正确的方向。