0.1.1 • Published 8 years ago

ez-router v0.1.1

Weekly downloads
4
License
ISC
Repository
github
Last release
8 years ago

Router

Rails 风格的路由。

Routes - 默认配置的路由

参考 Rails Routes 说明:

HTTP VerbPathController#ActionUsed for
GET/photosphotos#indexdisplay a list of all photos
GET/photos/newphotos#newreturn an HTML form for creating a new photo
POST/photosphotos#createcreate a new photo
GET/photos/:idphotos#showdisplay a specific photo
GET/photos/:id/editphotos#editreturn an HTML form for editing a photo
PATCH/photos/:idphotos#updateupdate a specific photo
DELETE/photos/:idphotos#destroydelete 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

0.1.1

8 years ago

0.1.0

9 years ago