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

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

我不确定如何将 MVC 架构应用到我的 Node Web 应用程序,特别是如何将模型与 Controller 分离。

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

以下是 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 文件。

最佳答案

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

对数据库所做的任何更改都将传播并可供您的 API 使用。它还将为可能的过滤器/选择提供大量模块化...

对于复杂的查询,DBA 将能够通过 API 开发供每个人使用的存储过程。这就是模型层。仅通过中间件公开 SQL。

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

使用中间件抽象模型层绝对可以节省大量时间。

对于 postgres 专业选项:postgres & pgrest

关于javascript - 如何在 Web 应用程序中使用 Node、Express、Postgresql 遵循 MVC 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69679585/

相关文章:

javascript - 设置谷歌折线图工具提示数据的格式以使用百分比

node.js - 如何将来自 Express 的路由用于 HTTPS?

Django + PostgreSQL 连接 - 无法使用服务器端游标

sql - 插入或更新时的 PostgreSQL 触发器

PostgreSQL:非空违规:7 错误:列 "id"中的空值违反非空约束

javascript - 气泡图动态更改 JSON 响应中的 X 标签值

java - Struts 2 - JQuery 插件 : Spinner Value change event

javascript - 如何计算射击子弹以击中移动目标的 Angular ?

node.js - 使用nodejs调用Stripe API获取total_count

javascript - 为什么使用 Node.js 的 i18n 不断删除和替换我的语言变量?