1

Я создаю приложение с NodeJS и ExpressJS. Моя структура папок выглядит следующим образом:Правильное место для размещения проверок db в nodejs

/app 
    /controllers 
    /models 

И я пытаюсь отделить всю логику и Db вызовов в модели и «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 асинхронных вызова БД (например, чтобы проверить, существует ли файл, разрешения и т. Д.), И я использую модуль водопада от 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); 
      }); 
     }, 

Мои вопросы:

  • Могу ли я делать это правильно?
  • Должен ли я помещать «водопад» в контроллер или он должен оставаться в модели?
  • Есть ли лучший способ сделать эти проверки?

ответ

1

Итак, во-первых, относительно ваших проверок - вы делаете это правильно. Поскольку все ваши проверки (из того, что я могу сказать), просто проверяют статические значения - они должны выполняться синхронно, поэтому вы совершенны.

Что касается ваших вызовов БД - да, использование метода водопада идеально подходит для вашего случая использования - но относительно того, где поставить эту логику - я немного смущен, так как не могу сказать, что происходит, скажем, путем чтения источника.

Если ваш метод createFile работает с моделью, я предлагаю вставить этот код в свои модели. Общее правило MVC состоит в том, чтобы сохранить ваши тезисы действительно ясными - изолировать весь код, связанный с данными, в своей модели и сохранить свои контроллеры насколько это возможно.

Смежные вопросы