在nodejs中放置数据库检查的正确位置

我正在用NodeJS和ExpressJS构build一个应用程序。 我的文件夹结构如下所示:

/app /controllers /models 

我试图分离模型中的所有逻辑和数据库调用,以及控制器中的“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(){...}); 

做简单的检查。 但是,在完成所有validation之后,我需要完成3个asynchronous数据库调用(例如,检查文件是否存在,权限等),并使用模型中的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); }); }, 

我的问题是:

  • 我做对了吗?
  • 我应该把“瀑布”放在控制器中,还是应该留在模型中?
  • 有没有更好的方法来做这些检查?

所以,首先,关于你的支票 – 你正在做那些正确的。 由于你所有的检查(从我所知道的)只是检查静态值 – 它们必须同步执行,所以你是完美的。

关于你的数据库调用 – 是的,使用瀑布方法是你的使用情况的完美 – 但关于在哪里把这个逻辑 – 我有点困惑,因为我不能说通过阅读资源。

如果你的createFile方法在模型中运行,那么我build议把这些代码放到你的模型中 – 一般的MVC规则是保证你的摘要真的很清晰 – 隔离模型中所有与数据相关的代码,并尽可能保持你的控制器纯粹。