【发布时间】:2021-02-14 10:49:08
【问题描述】:
我有一个返回其他函数的函数,如下所示:
export const makeAudienceDb = () => {
async function insert({ ...params }: AudienceAttributes) {
const audience = await AudienceModel.create({ ...params })
const audienceToJson = audience.toJSON()
return audienceToJson
}
async function findById({ id }: { id: number }) {
const user = await AudienceModel.findByPk(id)
return user?.toJSON()
}
async function remove({ id }: { id: number }) {
return AudienceModel.destroy({ where: { id } })
}
async function update({
id,
...changes
}: { id: number } & AudienceAttributes) {
const updated = await AudienceModel.update(
{ ...changes },
{ where: { id } }
)
return updated
}
return Object.freeze({
insert,
findById,
remove,
update,
})
}
我有其他模型,例如UserModel、PostModel,它们具有与makeAudienceDb 相同的数据库操作。例如
export const makeUsersDb = ({ hashPassword, createToken }: DBDeps) => {
async function insert({ ...params }: User) {
if (params.password) {
params.password = await hashPassword(params.password)
}
const newUser = await UserModel.create({ ...params })
const returnedUser = newUser.toJSON()
const { id } = newUser
const { name, username, email, password } = returnedUser as User
const payload = {
id,
email,
}
const token = createToken(payload)
const user = { id, name, username, password, email }
return { user, token }
}
async function findById({ id }: { id: number }) {
const user = await UserModel.findByPk(id)
return user?.toJSON()
}
async function findByEmail({ email }: { email: string }) {
const user = await UserModel.findOne({ where: { email } })
return user?.toJSON()
}
async function remove({ id }: { id: number }) {
return UserModel.destroy({ where: { id } })
}
async function update({ id, ...changes }: { id: number } & User) {
const updated = await UserModel.update({ ...changes }, { where: { id } })
return updated
}
return Object.freeze({
insert,
findByEmail,
findById,
remove,
update,
})
}
这会导致不同级别的代码重复。我想知道如何创建一个可以重用于其他数据库操作的主要功能。因此,除了我拥有makeAudienceDb、makeUsersDb,我可以只拥有一个主要功能,例如majorDatabaseOps,其中makeAudienceDb 和makeUsersDb 可以继承自。我知道这对于 ES6 类和Interfaces 是可能的,但我只是想知道如何以一种功能性的方式实现它。欢迎任何贡献。非常感谢!
【问题讨论】:
标签: javascript node.js typescript express