我是 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
因此,我有两个模型:Company
和 Employee
。
该模型的目的是加载数据库数据并提供方便的编程接口(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/