javascript - 关于使用 NodeJs 和 MySQL 的 Web 应用程序中的 MVC 架构模型的问题

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

我是 NodeJs 新手,我正在尝试使用 Express 框架和 MySql 创建一个 Web 应用程序。我知道在 MVC 架构中, View 是例如 *.ejs 文件。 Controller 应该有逻辑,模型应该关注数据库。

但我仍然不太确定模型内部应该包含什么。我的 Controller 中有以下代码(可能是错误的,不遵循 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
    });
});

现在,根据我所读到的内容, Controller 应该要求模型执行对数据库的查询,获取结果并渲染 View (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 发出查询,处理任何错误并返回结果。

根据我所读到的内容,我有两个选择。选项1:将回调函数传递给模型并让模型渲染 View (我认为这是错误的,模型不应该与 View 通信,或者不?)选项2:可以使用async/await并等待模型返回结果,但我不确定这是否可能或如何实现。

最佳答案

模型是数据库中存储的数据的编程表示。假设我有一个具有以下架构的 employees 表:

name: string
age: number
company: company_foreign_key

另一个名为companies的表

name: string
address: string

因此,我有两个模型:CompanyEmployee

该模型的目的是加载数据库数据并提供方便的编程接口(interface)来访问该数据并对其进行操作

所以,我的 Controller 可能如下所示:

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

})

基本上,该模型为数据库中的原始数据提供了便捷的接口(interface)。该模型执行下面的查询,并提供方便的方法作为 Controller 访问的公共(public)接口(interface)。例如,给定员工对象的员工模型可以通过执行该查询来找到员工的公司。

上面只是一个例子,如果多加思考,可以想出更好的界面。事实上,Mongoose 提供了一个关于如何设置模型接口(interface)的很好的例子。如果您了解 Mongoose 的工作原理,您可以使用相同的原理并将其应用到您的自定义模型实现中。

关于javascript - 关于使用 NodeJs 和 MySQL 的 Web 应用程序中的 MVC 架构模型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53594229/

相关文章:

php - 为什么我会收到 MySQL 错误 1062?

node.js - Proxyquire、rewire、SandboxedModule 和 Sinon : pros & cons

javascript - React export 声明语句预期

javascript - 尝试使用数组和循环重写 JS 测验——正确答案在哪里?

javascript - 在某些情况下禁止用户离开页面

mysql - 如何编写MySQL before insert触发器来向表中插入数据?

php - PHP 中每个循环的日期重复两次

javascript - 使用node.js在javascript服务器中运行html

javascript - 如何将数据从子级传递给父级 : Angular2

javascript - 使用 VueJS 2 禁用 v-for 循环中的按钮