Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在nodejs中放置数据库检查的正确位置_Javascript_Node.js_Asynchronous_Model View Controller_Express - Fatal编程技术网

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

Javascript 在nodejs中放置数据库检查的正确位置,javascript,node.js,asynchronous,model-view-controller,express,Javascript,Node.js,Asynchronous,Model View Controller,Express,我正在用NodeJS和ExpressJS构建一个应用程序。 我的文件夹结构如下所示: /app /controllers /models 我试图分离模型中的所有逻辑和db调用以及控制器中的“usertomodel”操作。 在控制器中,我有以下代码:(在控制器中) 做简单的检查。 但在完成所有验证之后,我需要执行3次异步DB调用(例如检查文件是否存在、权限等),并且在模型中使用asyncnpm包中的瀑布模块,它看起来如下:(在模型中) 我的问题是: 我这样做对吗 我应该将“瀑布

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

/app
    /controllers
    /models
我试图分离模型中的所有逻辑和db调用以及控制器中的“usertomodel”操作。 在控制器中,我有以下代码:(在控制器中)

做简单的检查。 但在完成所有验证之后,我需要执行3次异步DB调用(例如检查文件是否存在、权限等),并且在模型中使用
async
npm包中的瀑布模块,它看起来如下:(在模型中)

我的问题是:

  • 我这样做对吗
  • 我应该将“瀑布”放在控制器中还是应该留在模型中
  • 有没有更好的方法进行这些检查

因此,首先,关于你的支票,你做得很好。因为所有的检查(据我所知)都只是检查静态值——它们必须同步执行,所以您是完美的

关于您的DB调用——是的,使用瀑布方法非常适合您的用例——但是关于将该逻辑放在哪里——我有点困惑,因为我无法通过阅读源代码来判断每个语句发生了什么

如果您的
createFile
方法适用于模型,我建议将该代码放入您的模型中——一般的MVC规则是保持您的摘要非常清晰——隔离模型中所有与数据相关的代码,并尽可能保持控制器的纯净

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