Node.js 最小工作量数据库抽象层
嘿,我正在做一个小项目,出于所有的意图和目的,我将使用mongodb,但是作为实践,我希望使用数据库抽象层(这需要最少的努力)。我想到了这个: db.js:Node.js 最小工作量数据库抽象层,node.js,mongodb,mongoose,abstraction,Node.js,Mongodb,Mongoose,Abstraction,嘿,我正在做一个小项目,出于所有的意图和目的,我将使用mongodb,但是作为实践,我希望使用数据库抽象层(这需要最少的努力)。我想到了这个: db.js: 我知道这不是一个很好的抽象级别,但如果我想迁移到另一种数据库技术,它仍然会给我这样做的接口,我想要一些快速且易于实现的东西,这行得通吗?有什么我没有考虑的主要缺点吗?我以前在一个项目中尝试过,它背后的想法(能够在不涉及业务逻辑的情况下更改数据层)很酷,但是,这是一个很大的麻烦,在某种程度上,我感觉我在重新编写mongoose库。我能够抽象出
我知道这不是一个很好的抽象级别,但如果我想迁移到另一种数据库技术,它仍然会给我这样做的接口,我想要一些快速且易于实现的东西,这行得通吗?有什么我没有考虑的主要缺点吗?我以前在一个项目中尝试过,它背后的想法(能够在不涉及业务逻辑的情况下更改数据层)很酷,但是,这是一个很大的麻烦,在某种程度上,我感觉我在重新编写mongoose库。我能够抽象出应用程序使用的所有方法,但是,我不认为我会在另一个项目上再次这样做,除非这是项目所有者提出的一个无争议的要求,我宁愿等到这个假设场景发生时再更改应用程序的数据层,然后我会找出应用的最佳修复方法。我相信您没有考虑到的一些事情:(1)从我上面看到的,您的应用程序仍然需要mongoose感知,因为当它调用findOne(或任何其他抽象方法)时,它必须以mongoose期望的方式传递参数,因此当您将数据层更改为使用firebase时,还必须更新调用代码。(2) 通常情况下,您会希望使用
select
,limit
,skip
,populate
等方法扩展mongoose查询。我认为这个抽象没有考虑到这一点。我想我应该详细阐述一下,我已经意识到这两个问题,然而,我的想法是在从db.js调用函数时限制我对这些“高级查询”的使用,但是我得出的结论是,拥有一个提供比您允许使用的更多功能的接口是非常不可靠的(有点违背了接口的目的)。我还得出结论,对数据库抽象层的需求足够大,您可以实现一个数据库抽象层,但同时您不想像我建议的那样投入更多精力的项目是不存在的;博士,我认为它太懒了,我认为它除了能说“理论上我有一个数据库抽象层”之外没有任何附加值
const mongoose = require('mongoose', { useNewUrlParser: true})
const {credentials} = require('../../config');
const { connectionString } = credentials.mongo;
const User = require('../../models/user')
if (!connectionString){
console.error("MongoDB connection string missing!")
process.exit(1)
}
mongoose.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true })
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
const mongoLink = mongoose.connection
mongoLink.on('error', err=>{
console.error("MongoDB error: " + err.message);
})
mongoLink.once('open', () => console.log('MongoDB connection established'))
function abstractFromDatabase(model){
return {
findOne : (async function() {
return model.findOne(...arguments).lean()
}),
findMany : (async function() {
return model.findMany(...arguments).lean()
})
//... more primitive functions here
}
}
module.exports.User = abstractFromDatabase(User)
//adding functions specific to model here
module.exports.User.getAllRelatedUsers = (async function() {
//...
})
//...export more database functionality