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对于答案,我将等待其他意见。我想知道查询和编写彼此完全独立的服务的最佳方式,我找不到大型生产节点应用程序来查看它们如何处理所有查询、搜索和过滤。是的,这对于每个应用程序来说都是独一无二的。依我看,这种方法适用于大多数应用程序,但显然不是所有应用程序。祝你好运