添加mvc目录

很多人是这样的做法:

  1. $ tree . -L 1 -d
  2. .
  3. ├── actions
  4. ├── config
  5. ├── cron_later
  6. ├── doc
  7. ├── middleware
  8. ├── migrate
  9. ├── models
  10. ├── node_modules
  11. ├── public
  12. ├── queues
  13. ├── routes
  14. ├── test
  15. ├── tmp
  16. ├── uploads
  17. └── views

说明

  • 继承express-generator的结构(routes和views)
  • actions即controller控制器层
  • models即模型层
  • config是配置项目录
  • middleware中间件层
  • migrate是我们处理数据的,跟rails的migrate不完全一样
  • test是测试目录
  • queues是队列
  • cron_later是调度
  • doc文档
  • uploads是上传自动创建的目录

这阶段仅仅是用,算是基于express抽象了一点业务、配置相关的东西而已,目录多了依然蛋疼

所以还是rails的更清晰一些

  1. rails new blog --skip-bundle
  2. git:(master) tree blog -L 2 -d
  3. blog
  4. ├── app
  5. ├── assets
  6. ├── controllers
  7. ├── helpers
  8. ├── mailers
  9. ├── models
  10. └── views
  11. ├── bin
  12. ├── config
  13. ├── environments
  14. ├── initializers
  15. └── locales
  16. ├── db
  17. ├── lib
  18. ├── assets
  19. └── tasks
  20. ├── log
  21. ├── public
  22. ├── test
  23. ├── controllers
  24. ├── fixtures
  25. ├── helpers
  26. ├── integration
  27. ├── mailers
  28. └── models
  29. ├── tmp
  30. └── cache
  31. └── vendor
  32. └── assets
  33. 29 directories

so,我们也来建一个吧

这些就是基本的mvc目录,但是express有其自己的特点,比如路由和中间件等,想想还是放app项目更好一些

  1. mkdir -p app/controllers
  2. mkdir -p app/models
  3. mkdir -p app/middlewares

而views和routes是已有目录,只需要移动到app下即可

  1. mv views app/views
  2. mv routes app/routes

我们记得,mount-routes里修改了app里的路由路径,改一下就好

  1. mount_routes(app, __dirname + '/routes', true);

改为

  1. mount_routes(app, __dirname + '/app/routes', true);
  1. app.set('views', path.join(__dirname, 'views'));

改为

  1. app.set('views', path.join(__dirname, 'app/views'));

至此我们的基本目录是有了的下面

下面我们要考虑职责的事儿了

SOLID(藏头命名)

  • 单一职责原则 (Single Responsibility Principle,SRP)
  • 开放/封闭原则(Open/Close Principle,OCP)
  • 里氏替换原则(Liskov Substitution Principle,LSP)
  • 接口分离原则(Interface Segregation Principle,ISP)
  • 依赖倒置原则(Dependency Inversion Principle,DIP)

此时的路由里完成各种逻辑,实际上是不太合理,没有遵循mvc原则

理想的做法是我们创建一个model叫Order,它有

  • routes/order.js
  • controllers/OrderController.js
  • models/Order.js
  • views/order/*.jade

这是正确的做法

最佳目录结构应该如下

  1. git:(master) tree app -L 3
  2. app
  3. ├── controllers
  4. └── orders_controller.js
  5. ├── models
  6. └── order.js
  7. ├── routes
  8. ├── api
  9. └── orders.js
  10. └── orders.js
  11. └── views
  12. └── orders
  13. ├── edit.jade
  14. ├── index.jade
  15. ├── new.jade
  16. ├── order.jade
  17. └── show.jade
  18. 6 directories, 9 files

调用级别是

  • 我们在路由里不写任何逻辑代表,只是让他转到controller
  • 然后controller调用mode里方法完成业务逻辑,并根据返回时,处理视图渲染
  • 视图只根据controller给的内容进行渲染即可