在 Koa/Express 等 Node Web 框架中, 可以通过冒号(:)定义路由参数.

// GET /users/123/books/456

//Express
app.get('/users/:userId/books/:bookId', function (req, res) {
  res.send(req.params) // => { userId: '123', bookId: '456' }
})

// Koa
router.get('/users/:userId/books/:bookId', (ctx, next) => {
  console.log(ctx.params); // => { userId: '123', bookId: '456' }
})

Google 的 Restful API 指导 中, 通过 冒号+动词 描述无法通过 HTTP method 表达的接口. 如: POST /files/a/long/file/name:undelete.

由此引出问题: Koa/Express 如何定义含有冒号(:)的路由 ?

Koa/Express 背后都是使用的 Path-to-RegExp. path-to-regexp>=0.2 版本支持通过转义达到效果.

目前 Express 使用的是0.1.7版本, 暂不支持. 官方计划在 Express 5 版本升级 path-to-regexp 版本: #3419 #3409 #3142 #2530.

Koa-Router 使用的是^1.1.1 版本, 可以正常支持. 示例代码:

router.post('/tasks/:_id\\:undelete', (ctx, next) => {
	console.log(ctx.params)
}

参考资料