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

Right place to place db checks in nodejs

本文关键字:位置 检查 数据库 nodejs 置数据      更新时间:2023-09-26

我正在使用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规则是保持你的摘要非常清晰——隔离模型中所有与数据相关的代码,并保持你的控制器尽可能纯净。