mirror of
https://github.com/typicode/json-server.git
synced 2025-07-30 13:42:11 +08:00
Update rewriter (#580)
This commit is contained in:
@ -1,8 +1,15 @@
|
||||
# Change Log
|
||||
|
||||
## 0.11.0 - 2017-07-05
|
||||
|
||||
Switch to [express-urlrewrite](https://github.com/kapouer/express-urlrewrite) to support rewriting query parameters (e.g. `/articles?id=1 # → /posts/1`)
|
||||
|
||||
If you're rewriting default routes, you'll need to update your `routes.json` file
|
||||
(see [add custom routes](https://github.com/typicode/json-server#add-custom-routes) for updated doc).
|
||||
|
||||
## 0.10.3 - 2017-06-28
|
||||
|
||||
* Fix line-break error in CLI
|
||||
* Fix `line-break` error in CLI
|
||||
|
||||
## 0.10.2 - 2017-06-28
|
||||
|
||||
|
12
README.md
12
README.md
@ -314,9 +314,10 @@ Create a `routes.json` file. Pay attention to start every route with `/`.
|
||||
|
||||
```json
|
||||
{
|
||||
"/api/": "/",
|
||||
"/blog/:resource/:id/show": "/:resource/:id",
|
||||
"/blog/:category": "/posts?category=:category"
|
||||
"/api/*": "/$1",
|
||||
"/:resource/:id/show": "/:resource/:id",
|
||||
"/posts/:category": "/posts?category=:category",
|
||||
"/articles\\?id=:id": "/posts/:id"
|
||||
}
|
||||
```
|
||||
|
||||
@ -331,8 +332,9 @@ Now you can access resources using additional routes.
|
||||
```sh
|
||||
/api/posts # → /posts
|
||||
/api/posts/1 # → /posts/1
|
||||
/blog/posts/1/show # → /posts/1
|
||||
/blog/javascript # → /posts?category=javascript
|
||||
/posts/1/show # → /posts/1
|
||||
/posts/javascript # → /posts?category=javascript
|
||||
/articles?id=1 # → /posts/1
|
||||
```
|
||||
|
||||
### Add middlewares
|
||||
|
17
package-lock.json
generated
17
package-lock.json
generated
@ -1236,6 +1236,23 @@
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz",
|
||||
"integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI="
|
||||
},
|
||||
"express-urlrewrite": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/express-urlrewrite/-/express-urlrewrite-1.2.0.tgz",
|
||||
"integrity": "sha1-jmZ7d2H/HH/9sO+gXWQDU4fII+s=",
|
||||
"dependencies": {
|
||||
"isarray": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
|
||||
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
|
||||
"integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30="
|
||||
}
|
||||
}
|
||||
},
|
||||
"extend": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
|
||||
|
@ -15,6 +15,7 @@
|
||||
"cors": "^2.3.0",
|
||||
"errorhandler": "^1.2.0",
|
||||
"express": "^4.9.5",
|
||||
"express-urlrewrite": "^1.2.0",
|
||||
"json-parse-helpfulerror": "^1.0.3",
|
||||
"lodash": "^4.11.2",
|
||||
"lodash-id": "^0.13.0",
|
||||
|
@ -1,11 +1,6 @@
|
||||
const express = require('express')
|
||||
const url = require('url')
|
||||
const _ = require('lodash')
|
||||
function updateQueryString(target, sourceUrl) {
|
||||
return ~sourceUrl.indexOf('?')
|
||||
? _.assign(target, url.parse(sourceUrl, true).query)
|
||||
: {}
|
||||
}
|
||||
const rewrite = require('express-urlrewrite')
|
||||
|
||||
module.exports = routes => {
|
||||
const router = express.Router()
|
||||
|
||||
@ -13,26 +8,8 @@ module.exports = routes => {
|
||||
res.json(routes)
|
||||
})
|
||||
|
||||
Object.keys(routes).forEach(route => {
|
||||
if (route.indexOf(':') !== -1) {
|
||||
router.all(route, (req, res, next) => {
|
||||
// Rewrite target url using params
|
||||
let target = routes[route]
|
||||
for (let param in req.params) {
|
||||
target = target.replace(`:${param}`, req.params[param])
|
||||
}
|
||||
req.url = target
|
||||
req.query = updateQueryString(req.query, req.url)
|
||||
next()
|
||||
})
|
||||
} else {
|
||||
router.all(`${route}*`, (req, res, next) => {
|
||||
// Rewrite url by replacing prefix
|
||||
req.url = req.url.replace(route, routes[route])
|
||||
req.query = updateQueryString(req.query, req.url)
|
||||
next()
|
||||
})
|
||||
}
|
||||
Object.keys(routes).forEach(key => {
|
||||
router.use(rewrite(key, routes[key]))
|
||||
})
|
||||
|
||||
return router
|
||||
|
@ -42,7 +42,7 @@ describe('cli', () => {
|
||||
)
|
||||
|
||||
routesFile = tempWrite.sync(
|
||||
JSON.stringify({ '/blog/': '/' }),
|
||||
JSON.stringify({ '/blog/*': '/$1' }),
|
||||
'routes.json'
|
||||
)
|
||||
|
||||
@ -260,7 +260,7 @@ describe('cli', () => {
|
||||
})
|
||||
|
||||
it('should watch routes file', done => {
|
||||
fs.writeFileSync(routesFile, JSON.stringify({ '/api/': '/' }))
|
||||
fs.writeFileSync(routesFile, JSON.stringify({ '/api/*': '/$1' }))
|
||||
setTimeout(() => {
|
||||
request.get('/api/posts').expect(200, done)
|
||||
}, 1000)
|
||||
|
@ -8,11 +8,11 @@ describe('Server', () => {
|
||||
let router
|
||||
let db
|
||||
const rewriterRules = {
|
||||
'/api/': '/',
|
||||
'/api/*': '/$1',
|
||||
'/blog/posts/:id/show': '/posts/:id',
|
||||
'/comments/special/:userId-:body': '/comments/?userId=:userId&body=:body',
|
||||
'/firstpostwithcomments': '/posts/1?_embed=comments',
|
||||
'/articles?_id=:id': '/posts/:id'
|
||||
'/articles\\?_id=:id': '/posts/:id'
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
@ -660,13 +660,8 @@ describe('Server', () => {
|
||||
it('should rewrite using params and query', () =>
|
||||
request(server).get('/comments/special/1-quux').expect([db.comments[4]]))
|
||||
|
||||
// TODO
|
||||
// it('should rewrite query params', () => (
|
||||
// request(server)
|
||||
// .get('/articles?_id=1')
|
||||
// .expect(db.posts[0])
|
||||
// .end(done)
|
||||
// })
|
||||
it('should rewrite query params', () =>
|
||||
request(server).get('/articles?_id=1').expect(db.posts[0]))
|
||||
|
||||
it('should expose routes', () =>
|
||||
request(server).get('/__rules').expect(rewriterRules))
|
||||
|
Reference in New Issue
Block a user