来聊聊Router和Controller的紧耦合和一般的做法
发布于 11 年前 作者 RicterZ 4973 次浏览 最后一次编辑是 8 年前

N-Blog的教程,和网上大多数主流教程,Router和Controller紧密耦合。虽然Router也是Controller的一部分,但是这样看怎么样也不是很优雅。
所以一般而言,都会怎么做?没有一个清晰的路由表很不爽的。
我目前的做法是将代码导出模块,然后在路由表传入。

这是routers/index.js

var Auth = require('../controller/authorization'),
    ArticleHandler = require('../controller/articles');

module.exports = function(app) {
    // router of index
    app.get('/', function(req, res){res.end("Hello world!")});

    // router of /article
    app.get('/articles', ArticleHandler.list_articles);
    app.post('/articles', Auth.auth, ArticleHandler.add_article);

    // router of /article/(.*)
    app.put('/articles/:id', Auth.auth, ArticleHandler.modify_article);
    app.get('/articles/:id', ArticleHandler.get_a_article);
    app.delete('/articles/:id', Auth.auth, ArticleHandler.remove_article);

    // router of /api-auth
    app.post('/api-auth', Auth.get_token);

    // router of /tags
    app.get('/tags', function(req, res){});
    // todo
};

然后controller里有articles.jsauthorization.js
articles.js为例,里面是一个Article类,然后暴露Article的接口。

var Article = require('../models/articles'),
    User = require('../models/users'),
    Auth = require('authorization');


function ArticleHandler() {
    //Article Handlers
}

ArticleHandler.list_articles = function(req, res) {
    // some statements
};

// Others

module.exports = ArticleHandler;

感觉比较蛋疼的。
不知你们的通用做法是?

6 回复

另外callback真是忧伤,让写出来的代码很脏,也不算优雅。
不过令人欣慰的是有中间件这个东西。要不然更蛋疼了。

没人鸟我=-=

乍一看这么写并没有什么不好的啊?不知道你哪里不满意~

callback的嵌套问题,可以交个promise来解决吧~

controller这个东西除了组织代码没看出来有什么用,组织代码可以用命名空间或者子目录, web框架只需要router,handle就可以了

一个handle一个文件,get/post/delete都是里面的方法handle多了可以分子目录存放,route独立出来做配置文件,就一个{’/xxx’:'ooHandle}就行了象express还有楼主这种路由与代码混在一起的,重构起来很麻烦

回到顶部