Вопрос о модели в архитектуре MVC в веб-приложении с использованием NodeJs и MySQL - PullRequest
0 голосов
/ 03 декабря 2018

Я новичок в NodeJ и пытаюсь создать веб-приложение, используя Express Framework и MySql.Я понимаю, что в архитектуре MVC представления представляют собой, например, файлы * .ejs.Предполагается, что контроллеры должны иметь логику, а модели должны сосредоточиться на базе данных.

Но все же я не совсем уверен, что должно быть внутри модели.У меня есть следующий код в моем контроллере (возможно, неправильно, не следуя дизайну MVC):

const mysql = require('mysql');
const db = mysql.createConnection(config);
db.query(query, (err, result) => {
    if (err) {
        return res.redirect('/');
    }
    res.render('index.ejs', {
        users: result
    });
});

Теперь из того, что я прочитал, контроллер должен попросить модель выполнить запрос к базе данных, получитьрезультаты и визуализация представления (index.ejs ').

У меня такой вопрос: что должно быть внутри файла model.js?Могу я сделать что-то подобное?

controller.js

const db = require('./models/model.js');
db.connect();
const results = db.query(query);
if(results != null) {
     res.render('index.ejs'){
          users: result
     });
}

model.js сделает запрос к mysql, обработает все ошибки и вернет результат.

Из того, что я прочитал, у меня есть два варианта.Option1: передать функцию обратного вызова в модель и позволить модели визуализировать представление (я думаю, что это неправильно, модель не должна взаимодействовать с представлением или нет?) Option2: возможно использование async / await и ожидание, пока модель вернет результаты, но яне уверен, возможно ли это или как.

1 Ответ

0 голосов
/ 03 декабря 2018

Модель представляет собой программное представление данных, хранящихся в базе данных.Скажем, у меня есть таблица employees со следующей схемой:

name: string
age: number
company: company_foreign_key

И еще одна таблица с именем companies

name: string
address: string

. Поэтому у меня есть две модели: Company и Employee.

Цель модели - загрузить данные базы данных и предоставить удобный программный интерфейс для доступа и обработки этих данных

Итак, мой контроллер может выглядеть так:

var db = require('mongo');
var employeeName = "bob";
db.connect(function(err, connection){

  const Employee = require('./models/Employee.js'); // get model class

  let employeeModel = new Employee(connection); // instantiate object of model class

  employee.getByName(employeeName, function(err, result){ // convenience method getByName

    employee.getEmployeeCompany(result, function(err, companyResult){ // convenience method getEmployeeCompany

     if(companyResultl) { // Controller now uses the results from model and passes those results to a view

       res.render('index.ejs')
        company: companyResult
     });
    })
  })
}

})

По сути, модель предоставляет удобный интерфейс для необработанных данных в базе данных.Модель выполняет запросы внизу и предоставляет удобные методы в качестве открытого интерфейса для доступа контроллера.Например, модель сотрудника, учитывая объект сотрудника, может найти компанию сотрудника, выполнив этот запрос.

Вышеприведенный пример является лишь примером, и, если уделить больше внимания, можно придумать лучший интерфейс.Фактически, Mongoose предоставляет отличный пример того, как настроить интерфейсы моделей.Если вы посмотрите, как работает Mongoose, вы можете использовать те же принципы и применить их к реализации своей пользовательской модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...