如何使用 Node、Express、Postgresql 在 Web 应用程序中遵循 MVC 架构

How to follow MVC architecture in web app Using Node, Express, Postgresql

我不确定如何将 MVC 架构应用到我的节点 Web 应用程序,具体来说是将模型与控制器分开。

当前结构正确分隔了视图(我所有的 .ejs 文件)然后我猜我的 app.js 就像控制器一样,因为它包含响应 http 请求的所有路由。然后在 queries.js 文件中处理路由,我在该文件中使用 node-postgres 查询我的数据库(大多数呈现的视图要么显示来自数据库的信息,要么显示表单,以便用户可以将数据插入到数据库)。我是否应该以不同的方式执行此操作,或者更具体地说,我是否应该尝试创建一个包含来自数据库的原始数据的模型,并让路由处理程序操纵这些数据,而不是直接查询数据库(不确定我将如何处理插入数据库) ...)?我只是担心我当前构建 Web 应用程序的方式会随着它的增长而变得难以管理,并且其他人也难以理解和添加。

以下是 Web 应用程序当前结构的示例:假设用户单击一个按钮以显示所有活动订单,我的 app.js 文件看起来像这样

const db = require('./queries')

app.get('/activeorders', db.getActiveOrders)

我的 queries.js 文件会像这样处理这个路由:

const Pool = require('pg').Pool
const pool = new Pool({
  user: process.env.USER,
  host: process.env.HOST,
  database: process.env.DB,
  password: process.env.PASSWORD,
  port: process.env.PORT,
})

const getActiveOrders = (request, response) => {
    const queryOrders = 'SELECT * FROM orders WHERE complete=0 ORDER BY date_rec DESC;';
    pool.query(queryOrders, (error, results) => {
        if(error) {
            throw error
        }
        var ordersObj = results.rows;
        response.render('pages/activeorders', {
            ordersObj: ordersObj
        })
    })
}

module.exports = {
    getActiveOrders,
}

从处理程序中可以看出,查询数据库并将结果存储在一个对象中,然后在呈现时传递给 activeorders.ejs 文件。

设置app.js为根文件并创建一个控制器和一个模型文件夹。在 model 文件夹中定义所有模型,而在控制器中首先导入模型文件处理程序并创建所有 API 或查询函数。然后在根 app.js 文件中导入控制器函数处理程序和 运行 它。

在 MVC 模式中,我们拆分了应用程序的每个部分,因为这种软件开发方法通过将实现连接到不断发展的模型来满足复杂需求

建议您访问sample-mvc-express-postgres了解结构代码

如果您对设计模式感兴趣,请访问 https://dev.to/salah856/implementing-domain-driven-design-part-i-5a72,此 link 解释了如何在您的应用程序中使用 DDD 并展示了如何设计应用程序的每一层

也许使用中间件允许您从 Postgresql 数据库创建 API。

对数据库所做的任何更改都将传播并供您使用 API。它还将使许多可能的过滤器模块化/ select ...

对于复杂的查询,DBA 将能够通过 API 开发每个人都可以使用的存储过程。即 Model 层。只有 SQL 通过中间件公开。

Controller 将是您进行 API 调用和数据转换的方式,如果需要刷新基于您的数据 View

用中间件抽象模型层绝对是一个巨大的时间经济。

对于 postgres 专业选项:postgres & pgrest