Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 最小工作量数据库抽象层_Node.js_Mongodb_Mongoose_Abstraction - Fatal编程技术网

Node.js 最小工作量数据库抽象层

Node.js 最小工作量数据库抽象层,node.js,mongodb,mongoose,abstraction,Node.js,Mongodb,Mongoose,Abstraction,嘿,我正在做一个小项目,出于所有的意图和目的,我将使用mongodb,但是作为实践,我希望使用数据库抽象层(这需要最少的努力)。我想到了这个: db.js: 我知道这不是一个很好的抽象级别,但如果我想迁移到另一种数据库技术,它仍然会给我这样做的接口,我想要一些快速且易于实现的东西,这行得通吗?有什么我没有考虑的主要缺点吗?我以前在一个项目中尝试过,它背后的想法(能够在不涉及业务逻辑的情况下更改数据层)很酷,但是,这是一个很大的麻烦,在某种程度上,我感觉我在重新编写mongoose库。我能够抽象出

嘿,我正在做一个小项目,出于所有的意图和目的,我将使用mongodb,但是作为实践,我希望使用数据库抽象层(这需要最少的努力)。我想到了这个:

db.js:


我知道这不是一个很好的抽象级别,但如果我想迁移到另一种数据库技术,它仍然会给我这样做的接口,我想要一些快速且易于实现的东西,这行得通吗?有什么我没有考虑的主要缺点吗?

我以前在一个项目中尝试过,它背后的想法(能够在不涉及业务逻辑的情况下更改数据层)很酷,但是,这是一个很大的麻烦,在某种程度上,我感觉我在重新编写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