我正在使用存储库模式,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;
答案 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();
},
},
};
现在一切都很好。感谢大家指导我正确的方向。