ez-router
A rails like router for express and koa-router
Last updated 4 years ago by dotnil .
ISC · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install ez-router 
SYNC missed versions from official npm registry.

Router

Rails 风格的路由。

Routes - 默认配置的路由

参考 Rails Routes 说明:

HTTP Verb Path Controller#Action Used for
GET /photos photos#index display a list of all photos
GET /photos/new photos#new return an HTML form for creating a new photo
POST /photos photos#create create a new photo
GET /photos/:id photos#show display a specific photo
GET /photos/:id/edit photos#edit return an HTML form for editing a photo
PATCH /photos/:id photos#update update a specific photo
DELETE /photos/:id photos#destroy delete a specific photo

Usage - 使用说明

Express - 在 Express 中配置

在 app.js 中:

var router = require('ez-router')
var homepage = require('./routes/homepage')


router(app, function(app) {
  namespace('admin', function() {
    resources('creations')
  })

  resources('users')

  app.get('/about', homapage.about)
})

默认情况下,ez-router 会去当前进程目录 process.cwd()routes 目录下找对应的模块。 例如,上述代码示例中,将会加载:

./routes/admin/creation.js
./routes/user.js

注意模块名就变成单数。

模块中暴露出来的方法,将根据 Rails Routes 规范映射起来,如果没找到对应规则上的方法,就不会 绑定对应的路由。

beforeFilter - 增加中间件

function authenticate(req, res, next) {
  if (req.user) {
    next()
  } else {
    next(new Error('Forbidden'))
  }
}

function findOne(req, res, next) {}


/*
 * GET /users/:id
 */
exports.show = function(req, res, next) {
  // implementation detail
}


/*
 * GET /users/:id/edit
 */
exports.edit = function(req, res, next) {
  // implementation detail
}


/*
 * PATCH /users/:id
 */
exports.update = function(req, res, next) {
  // implementation detail
}


// routes/user.js
exports.beforeFilter = {
  '*': authenticate,
  'show edit': findOne
}

展开来就是:

app.get('/users/:id', authenticate, findOne, exports.show)
app.get('/users/:id/edit', authenticate, findOne, exports.edit)
app.patch('/users/:id', authenticate, exports.update)

Why Globals - 全局变量是什么鬼

用 JavaScript 实现 DSL 都不是一份好差事,很容易做着做着就变成类似 MongoDB 的 Query, 或者 model 那种方式,灵活运用 this。

很难做得像 Ruby 里那样自然,对应到具体的 DSL,比如 Rails 项目里的 config/routes.rb, 或者 capistrano、mina 要求的那份 config/deploy.rb,更别提 gemspec 文件。

不过,类似 mocha 这种,利用全局函数实现流畅代码编写的做法,却不失为一种好办法。我们可以把 railstyle-router 中采用的 app.namespacethis.member 变成:

namespace('admin', function() {
  resources('creations', function() {
    member('post', 'launch')
  })
})

这和 Rails 的写法还是比较相近的:

namespace :admin do
  resources :creations do
    member do
      post :launch
    end
  end
end

使用 ez-router 的时候,在回调函数执行完毕后,将会清除这些全局函数:

var router = require('ez-router')

router(app, function(app) {
  namespace('admin', function() {
    resources('creations')
  })

  resources('users')
})

console.log(typeof namespace)     // 'undefined'
console.log(typeof resources)     // 'undefined'

References

Current Tags

  • 0.1.1                                ...           latest (4 years ago)

2 Versions

  • 0.1.1                                ...           4 years ago
  • 0.1.0                                ...           5 years ago
Maintainers (1)
Downloads
Today 0
This Week 0
This Month 0
Last Day 0
Last Week 0
Last Month 0
Dependencies (0)
None
Dev Dependencies (5)
Dependents (2)

Copyright 2014 - 2017 © taobao.org |