我的代码有效,但我知道最好有胖模型和瘦控制器。
然而,我使用3种不同的型号,不幸的是我的控制器变胖了。组织此代码的最佳方法是什么(使用胖模型/瘦控制器概念)?我一直在阅读代码结构,但我对最佳实践有点不确定。
控制器:
var Product = require('../models/product');
var Collection = require('../models/collection');
var Vote = require('../models/vote');
exports.topSearch = function(req, res) {
console.log(req.body, "search product")
Product.search({
query_string: {
query: req.body.search
}
},req.body.searchObject,
function(err, results) {
if (err) console.log('ERR', err);
if (results) {
var data = results.hits.hits;
Vote.find({
user: req.user._id
}, function(err, votes) {
if (!err) {
for (var i = 0; i < votes.length; i++) {
for (var j = 0; j < data.length; j++) {
if (data[j]['_id'] == votes[i]['product']) {
data[j]['voteId'] = votes[i]['_id'];
data[j]['userVote'] = votes[i]['vote'];
}
}
}
}
Collection.find({
user: req.user._id
}, function(err, collections) {
if (!err) {
for (var i = 0; i < collections.length; i++) {
for (var j = 0; j < data.length; j++) {
if (data[j]['_id'] == collections[i]['product']) {
console.log('match')
data[j]['collected'] = true;
data[j]['collectId'] = collections[i]['_id'];
data[j]['favorite'] = collections[i]['favorite'];
} else if (data[j]['_id'] !== collections[i]['product'] && data[j]['collected'] !== true) {
data[j]['collected'] = false;
}
}
}
res.send(data);
}
});
});
} else {
res.send({
errmsg: 'results not defined'
})
}
});
};
然后我在我的路线中称呼它:
app.post('/products-search', users.ensureAuthenticated, products.topSearch);
答案 0 :(得分:0)
您可以在模型或功能下创建单独的文件,您可以在其中执行与&#34; topSearch&#34;相关的所有基于模型的处理。然后只需在控制器内部调用一个方法。
使用 async.js 之类的内容来更好地处理回调和流量。
我个人遵循此回购中定义的文件夹结构。
better-node-express-app-structure
有时我会根据复杂程度将子文件夹添加到模型和控制器中。
经常使用的选择查询可以直接导出为独立函数,以方便可重用性。