我正在使用NodeJS和ExpressJS构建应用程序。 我的文件夹结构如下所示:
/app
/controllers
/models
我正在尝试将模型中的所有逻辑和db调用与控制器中的“usertomodel”操作分开。 在控制器中,我有以下代码:(在控制器中)
app.post('/api/nodes/upload/image', processMultipartForm, function(req, res) {
if (!req.files.file) {
return res.status(400).json({
message: 'INVALID_FILE'
});
}
...
if (ALLOWED_FORMATS.indexOf(file.mimetype) == -1) {
return res.status(400).json({
message: 'INVALID_FILE_FORMAT'
});
}
.....
NodesModel.createFile({
...
}, {...}, function(){...});
进行简单的检查。
但是在我完成所有验证后,我需要做3个异步数据库调用(例如检查文件是否存在,权限等),并且我在模型中使用async
npm包中的瀑布模块它看起来像这样:(在模型中)
NodesSchema.statics.createFile = function(opts, user, cb) {
var _this = this;
async.waterfall([
function(callback) {
_this.findOne({
_id: opts.location
}, function(err, data) {
if (err) {
console.error(err);
return callback('INTERNAL_ERROR');
}
if (!data) {
return callback('INVALID_LOCATION');
}
callback(null, opts.location);
});
},
function(location, callback) {
_this.findOne({
location: location,
owner: user._id,
name: opts.name,
isFile: false
}, function(err, data) {
if (err) {
console.error(err);
return callback('INTERNAL_ERROR');
}
if (data) {
return callback('FILE_EXISTS');
}
callback(null);
});
},
我的问题是:
答案 0 :(得分:1)
所以,首先,关于你的检查 - 你正在做这些。由于您的所有检查(我可以判断)只是检查静态值 - 它们必须同步执行,因此您将完美无缺。
关于你的数据库调用 - 是的,使用瀑布方法非常适合你的用例 - 但是关于在哪里放置逻辑 - 我有点困惑,因为我无法告诉你发生了什么通过阅读消息来源说。
如果您的createFile
方法在模型中运行,我建议将该代码放入模型中 - 一般的MVC规则是保持您的摘要非常清晰 - 隔离模型中所有与数据相关的代码,以及保持控制器尽可能纯净。