Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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_Rest_Mongoose - Fatal编程技术网

Node.js 如何将数据库服务与分页和筛选隔离开来

Node.js 如何将数据库服务与分页和筛选隔离开来,node.js,mongodb,rest,mongoose,Node.js,Mongodb,Rest,Mongoose,我正在做一个比较大的项目,它有很多服务和查询数据库。在大多数项目中,都有一个功能,可以过滤文档或分页中的结果或搜索 我想知道我如何能有一个函数或模块来处理所有服务中的所有搜索,而不必在所有服务中编写相同(有点相同)的代码 例如,我有一个返回流行歌曲的功能: module.exports.get_trending_songs = async (req, res, next) => { var searchParams = {} var sortParams =

我正在做一个比较大的项目,它有很多服务和查询数据库。在大多数项目中,都有一个功能,可以过滤文档或分页中的结果搜索

我想知道我如何能有一个函数或模块来处理所有服务中的所有搜索,而不必在所有服务中编写相同(有点相同)的代码

例如,我有一个返回流行歌曲的功能:

module.exports.get_trending_songs = async (req, res, next) => {
        var searchParams = {}
        var sortParams = {}
        if (req.query.search) {
            searchParams = {
                name: new RegExp('.*' + req.query.search + '.*', "i")
            }
        }
        if (req.query.sort) {
            sortParams = (req.query.order == 1 ? '' : '-') + req.query.sort
        }
        var songs
        songs = await Song.find(searchParams)
            .limit(parseInt(req.query.limit))
            .skip(parseInt(req.query.skip))
            .sort(sortParams)
            .exec()
}
我有一个返回用户的函数:

module.exports.get_users = async (req, res) => {
    var searchParams = {}
    var sortParams = {}
    if (req.query.search != undefined) {
        searchParams = {
            name: new RegExp('.*' + req.query.search + '.*', "i")
        }
    }
    if (req.query.sort != undefined) {
        sortParams = (req.query.order == 1 ? '' : '-') + req.query.sort
    }
    var users = await User.find(searchParams)
        .select('-password')
        .limit(parseInt(req.query.limit))
        .skip(parseInt(req.query.skip))
        .sort(sortParams)
        .exec()
}

正如你所看到的,它们几乎是一样的!(假设我通过执行相同的查询并向其中添加
.count()
来返回分页内容(如nPages或countOfDocs)


处理其他模块中的所有辅助查询(分页、搜索等)并让服务仅关注主查询的最佳方式是什么?不

那些Mongoose函数返回一个您可以轻松传递的。。。因此,您可以编写一个函数,该函数接受一些内容(如Model和req参数)并执行所有常用方法,但随后在main方法中执行
exec()
,这样您就可以添加任何额外的内容(如从返回字段中删除密码)

这里有一个可能有效的例子,但是我没有测试过这个。。。所以你可能需要修补一下

function build_query = function(model, reqParams) {
    var searchParams = {}
    var sortParams = {}
    if (reqParams.search != undefined) {
        searchParams = {
            name: new RegExp('.*' + reqParams.search + '.*', "i")
        }
    }
    if (reqParams.sort != undefined) {
        sortParams = (reqParams.order == 1 ? '' : '-') + reqParams.sort
    }
    var query = model.find(searchParams)
        .select('-password')
        .limit(parseInt(reqParams.limit))
        .skip(parseInt(reqParams.skip))
        .sort(sortParams)
    return query
}

module.exports.get_users = async (req, res) => {
    var query = build_query(User, req.query)
    var users = await query.select('-password').exec()
}

module.exports.get_trending_songs = async (req, res, next) => {
    var query = build_query(Song, req.query)
    var songs = await query.exec()
}

谢谢你的回答,我知道这是最好的方法,但我在我的项目中实施这一点时遇到了问题。示例非常简单,我的服务非常复杂,我执行一些查询以获得结果,现在我想过滤该结果..就像对已被调用的查询调用
find()
+1对于答案,我将等待其他意见。我想知道查询和编写彼此完全独立的服务的最佳方式,我找不到大型生产节点应用程序来查看它们如何处理所有查询、搜索和过滤。是的,这对于每个应用程序来说都是独一无二的。依我看,这种方法适用于大多数应用程序,但显然不是所有应用程序。祝你好运