我已经在每个模型上继承了带有几个显式方法的代码库,并且我开始注意到,大多数(如果不是全部)这些方法可以简化为四个通用的创建,读取,更新和删除(CRUD)方法,只需通过路由或Web请求向其中传递适当的JSON,而不是在模型中明确定义诸如mongo查询之类的东西。
我的问题是:我是否偶然发现了最佳实践,还是这种简化带来了一些我还没有看到的安全漏洞或身份验证问题?
例如,所有这些方法都存在于models / user.js中:
module.exports.getUserByID = function (id, callback) {
const query = {'_id': id };
User.findOne(query, callback);
};
module.exports.getUserByUsername = function (username, callback) {
const query = {'username': username};
User.findOne(query, callback);
};
module.exports.getUserByFullname = function (fullname, callback) {
const query = {'name.fullname': fullname};
User.findOne(query, callback);
};
...我想将它们合并为一个方法...
models/user.js:
module.exports.getUser = function (query, callback) {
User.findOne(query, callback);
};
然后我是否需要三个不同的POST路由(/users/byId, /users/byName, and users/byFullName
),或者可能需要一个POST路由users/getUser
,可以通过cURL({'_id':"'$userID'"}, {'username':"'$userName'"},{'name.fullname':"'$userFullName'"}
)传递特定的查询?
我希望将每个models / *。js简化为一个架构和四个方法,将其留给路由或Web请求,以提供所有JSON,例如更新记录。我只是不确定这三个选项(几种模型方法(当前实现),几种路由或几种Web请求)中的哪一种是最佳实践。
我没有想到什么可能的未来问题?简化模型方法实际上是从一开始就应该编写的方式吗?
答案 0 :(得分:1)
您可以将 req.query
对象用于一般查询。
例如,对路由/users/getUser?_id=<some_user_id>
或/users/getUser?username=<some_user_name>
或/users/getUser?fullname=<some_full_name>
的GET请求可以实现如下:
var getUser = require('models/user');
app.get('/users/getUser', (req, res, next) => {
let query = req.query;
if (req.query.fullname) {
query['name.fullname'] = req.query.fullname;
delete query.fullname;
}
getUser(query, (err, user) => {
if (err) handleError(err);
console.log(user);
});
});