在 nodejs 中放置数据库检查的正确位置
Right place to place db checks in nodejs
我正在使用NodeJS和ExpressJS构建一个应用程序。我的文件夹结构如下所示:
/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(){...});
进行简单的检查。但是在我完成所有验证后,我需要做 3 次异步数据库调用(例如检查文件是否存在、权限等),并且我在模型中使用来自 npm 包async
瀑布模块,它看起来像这样:(在模型中)
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
方法在模型上工作,我建议把这些代码放到你的模型中——一般的MVC规则是保持你的摘要非常清晰——隔离模型中所有与数据相关的代码,并保持你的控制器尽可能纯净。
相关文章:
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 如果设置了位置,如何在每个状态下检查路由器ui,如果没有,则转到登录页
- 检查用户在使用传单时是否共享位置's locate()
- Js检查该位置是否在我的跨域网站中
- 函数来检查给定整数数组中给定位置的元素是否大于其两个邻域
- 检查数组位置是否真的未定义
- 检查对象是否正在查看位置
- 检查值存在于数组位置
- .offset() 并检查 jQuery 中的位置
- 如果用户靠近并触发特定事件,请检查位置数组
- 如何检查页面中的位置
- 无论如何可以检查 html 标签的位置
- 需要找到我的单选选项已检查值更改的位置
- 使用 JavaScript 检查字符串是否包含字符串中任何位置的 URL
- 检查脚本被调用的位置/哪一行或文档
- 在谷歌地图中检查位置变化
- 检查元素是否已更改其位置
- JQuery:如何在不实际点击或检查 href 的情况下确定点击引导的位置
- 下划线位置:如何检查匹配的字符串是否不区分大小写
- 在 nodejs 中放置数据库检查的正确位置