Nodejs/Expressjs 应用程序结构

22

假设我有这样一个代码来在expressjs中分离路由:

module.exports = function(express,app,client) {

    app.get('/', function(req,res,next) {
        var query = 'SELECT * FROM users LIMIT 10';
        var user = client.query(query, function (err, results, fields) {
            res.render('index', {
                title: 'test',
                users: results
            });
            client.end();
        });
    });
}

然后在app.js中要求它:

require('./controllers/routes.js')(express,app,client);

1) 如何以最佳方式将数据库查询拆分到新文件中?即使我分离了数据库逻辑,该文件也会变得非常大。

2) 分离路由的好方法是什么?也许是分离模块?然后在app.js中引用它们?

3个回答

33

这里有一个类似的问题,你应该读一下: 如何构建express.js应用程序结构?

1) 将所有的查询逻辑放在模型中(例如放在 /models 文件夹下的模块中)。

2) 将所有的路由(控制器)分离到模块中(并将它们放在 /routes 下)。在这里我指的路由是: - 所有与"Users"相关的路由逻辑都放在 /routes/users.js 中。

尽可能使你的应用保持MVC架构。

以下是上述应用的一个小例子:

app.js

// configuration for express etc
require('./routes/index')(app)

routes/index.js

var model = require("../models/users.js");

module.exports = function (app) {

  app.get('/', function (req, res, next) {
    model.get_recent(function (err, results) {
      // do stuff with your results
      res.render('index');
    });
  });

}

models/users.js

module.exports = {
  get_recent: function(callback) {
    var query = "SELECT * FROM users LIMIT 10";
    database.query(query, callback);
  }
}

3
不应该是require('./routes')(app);吗? - ThomasReggi
@alessioalex 这行代码 database.query(query, callback); 不会导致 node 应用挂起吗?我最近也在编写类似的东西,但我的做法是使用一些事件来处理。不过我对 node 还比较陌生,不确定我的做法是否正确。 - Eduárd Moldován
@EduárdMoldován 在 Node 中,你不能像 PHP 一样使用 sleep() 来“挂起”应用程序。但是,与此同时,如果你想要的话,可以执行其他操作(如对数据库进行多个查询、并行处理等)。如果你所说的“挂起”是指等待回调函数执行完成,那么是的 :-) - alessioalex
这正是我所说的“挂住”的意思,就是最后一个。 - Eduárd Moldován
他是这样做的:require('./routes/index')(app) - aliopi
显示剩余4条评论

5

在expressjs下载包中,有一个名为"mvc"的文件夹。作者提供了一个很好的微型且高效的mvc结构示例。仔细阅读代码,你将获得许多启发。


2
这个可以在visionmedia/express仓库中的express/examples/mvc目录下找到,供那些和我一样感兴趣的人参考。 - Cory Gross

1

你觉得 快速列车 怎么样?最近我一直在使用它,它能很好地适应复杂的应用程序结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接