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

标签 javascript node.js asynchronous model-view-controller express

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

/app
    /controllers
    /models

我试图将模型中的所有逻辑和数据库调用以及 Controller 中的“usertomodel”操作分开。 在 Controller 中我有以下代码:(在 Controller 中)

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 包中的 waterfall 模块,它看起来像这样:(在模型中)

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);
            });
        },

我的问题是:

  • 我这样做对吗?
  • 我应该将“waterfall ”放置在 Controller 中还是应该保留在模型中?
  • 是否有更好的方法来进行这些检查?

最佳答案

因此,首先,关于您的检查——您正在正确地进行这些检查。由于您的所有检查(据我所知)都只是检查静态值 - 它们必须同步执行,所以您是完美的。

关于您的数据库调用 - 是的,使用 waterfall 方法非常适合您的用例 - 但关于在哪里放置该逻辑 - 我有点困惑,因为我无法通过阅读源代码来判断到底发生了什么。

如果您的 createFile 方法在模型上工作,我建议将该代码放入您的模型中 - 一般的 MVC 规则是让您的摘要真正清晰 - 隔离模型中所有与数据相关的代码,并保持 Controller 尽可能纯净。

关于javascript - 在nodejs中放置数据库检查的正确位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987407/

相关文章:

node.js - socket.io 是如何工作的

javascript - Angular Controller 完成加载异步函数后加载 html View

c++ - 异步运行的函数的返回类型应该是什么

javascript - 尝试设置状态代码时,res.status 不是函数

javascript - 最有效/最短的方式花费 X 秒并将其变成 h :m:s

javascript - 从另一个页面加载 div 后更改元素

javascript - for-in 循环在后续执行中是否以相同的顺序迭代?

javascript - Express app.use 带有可选参数的路由

javascript - 异步和 Promise 的困境

javascript - 在 Javascript : Fails only if argument is prime 中通过埃拉托色尼筛法求和素数