как разбить логику на контроллер и модель в ноде

170
19 июня 2019, 08:30

Не совсем понимаю, как правильно нужно разбивать логику на controllers и models в nodeJS при работе с backend приложения. Допустим, у меня есть пример

Данный код находится в model моего приложения, и логически я понимаю, что модель отвечает только за выбор из базы, а проверку и все остальное должен выполнять контроллер, но я не совсем понимаю как это сделать и я пробовал часть кода перенести в контроллер, и экспортировать его, но у меня ничего не получилось( Прошу, помогите, хотя-бы на данном примере! Мне главное понять принцип работы с MVC в ноде!!!

Как я уже написал - >

postModejs.js

exports.homePage = function (req, res) {
  db.query('SELECT * FROM `posts`', function (err, result) {
    console.log(result);
    res.render('pages/home', {object: result});
  });
};
exports.currentPostPage = function(req, res){

db.query('SELECT * FROM `posts`', function (err, result) {
    if (err){
      console.log(err);
    }
    var post = result.filter(item => {return (item.id == req.params.id)? item: false})[0];
    if (post === undefined){
      res.render('pages/404');
    } else {
      res.render('pages/post-page', {postId: req.params.id, item: post});
    }
  });
};

server.js

var express = require("express");
var bodyParser = require('body-parser');
var login = require('./controllers/login.controller');
var register = require('./controllers/register.controller');
var db = require('./db');
var pageroutes = require('./models/pageroutes');
var controllers = require('./controllers/new-post.controller');
var app = express();
app.set("view engine", "ejs");
app.use("/public", express.static("public"));
app.use(bodyParser.urlencoded({ extended : false}));
app.use(bodyParser.json());
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
var router = express.Router();
//route to handle user registration
router.post('/register', register.register);
router.post('/login', login.login);
app.use('/api', router);
app.get('/register', pageroutes.registerPage);
app.get('/login', pageroutes.loginPage);
app.get('/', pageroutes.homePage);
app.post('/', controllers.newPost);
app.get('/post/:id', pageroutes.currentPostPage);
app.get('/contact', pageroutes.contactPage);
app.use(pageroutes.errorPage);
app.listen(3000);
Answer 1

Предлагаю организовать код следующим образом:
В роуте '/users' вызывается метод контроллера. В прилагаемом примере контроллер - userController, а вызывается его метод - handleUsers.
Этот метод получает помощью userModel.getAll всех пользователей и выбирает из них всех с id кратным 5.
Вместо обращения к базе данных в userModel используется обращение к ресурсу.

READ ALSO
Как сделать выезжающий блок?

Как сделать выезжающий блок?

Как сделать, чтобы изначально невидимый блок menu при нажатии на кнопку плавно выезжал справа на весь экранЭкран узкий мобильный

167
Работа с кнопками JavaScript

Работа с кнопками JavaScript

Есть анимация и 4 кнопки: Быстрее, Медленнее, Стоп, СтартКак сделать, чтобы при нажатии Старт, кнопка Стоп была неактивна, но если нажать потом...

164
Найти значения с тем же ключом в MySQL?

Найти значения с тем же ключом в MySQL?

Есть таблица table с полями key и nameИщу строки по значению name

140
Разпарсить из поля строку, сравнить её значения и записать результат сравнения в другое поле

Разпарсить из поля строку, сравнить её значения и записать результат сравнения в другое поле

Есть база данных футбольных матчей с результатамиНапример:

146