使用 Express.JS 的基本 MVC 原则

Basic MVC principles using Express.JS

express.js 为您提供了一个不错的准系统来实现标准的 MVC 开发模式。然而,我见过的大多数教程都在路由文件或全局应用程序文件中应用控制器逻辑。

在理想世界中:

模型 - 管理基本行为和数据

控制器 - 向模型和视图发送命令

View - 从模型中渲染数据


目前我有以下内容:

routes/index.js - 指向动作的路由

router.get('/hotels', function(req, res, next) {
    hotels.run(req, res, next);
    next();
});

controllers/hotels.js - 控制器向模型发送命令

module.exports = {
    run: function(req, res, next) {
        var users = new require('../models/hotels');
        users.run(function(callback) {
            res.render('hotels', { title: 'Hotels page', users: callback });
        }); 
    }
}

models/hotel.js - 模型请求数据

module.exports = {
    run: function(callback) {
        connection.query(sql, function(err, rows, fields) {
            callback(rows);
            //console.log(rows);
        });
    }
}

无论我尝试什么,我都无法将数据从模型 return 获取到控制器,然后再传递给视图。我知道上面的代码中可能存在多个错误,因为我是新手。但基本原理应该没问题,我希望我不能 return 模型数据的原因很明显,因为除了回调之外的所有逻辑都有效。

如果人们希望在 express.js 项目中使用类似的 MVC 方法,我相信我已经解决了这个问题。

routes.js - 更改为匹配 Kevin 的清洁方法。

router.get('/hotels', hotels.run);

controller/hotels.js -

module.exports = {
    run: function(req, res, next) {
        var users = new require('../models/hotels');
        users.run(function(err, callback) {
            res.render('hotels', { title: 'Hotels page', users: callback });
        });
    }
}

models/hotel.js

module.exports = {
    run: function(callback) {
        connection.query(sql, function(err, rows, fields) {
            callback(err, rows);
        });
    }
}

所以现在模型 returns 控制器请求的查询,使控制器能够将数据传递给视图。