From 21d2fff3a9f8160e154b4e8a5edd095a040ba76f Mon Sep 17 00:00:00 2001 From: typicode Date: Wed, 5 Jul 2017 13:17:10 +0200 Subject: [PATCH] Update rewriter (#580) --- CHANGELOG.md | 9 ++++++++- README.md | 12 +++++++----- package-lock.json | 17 +++++++++++++++++ package.json | 1 + src/server/rewriter.js | 31 ++++--------------------------- test/cli/index.js | 4 ++-- test/server/plural.js | 13 ++++--------- 7 files changed, 43 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd42ba5..63bd2d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/README.md b/README.md index a520d93..1d23008 100644 --- a/README.md +++ b/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 diff --git a/package-lock.json b/package-lock.json index 9c4a7a3..9f3d0c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 972856c..24e48b2 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/server/rewriter.js b/src/server/rewriter.js index c6227d9..a1df3b7 100644 --- a/src/server/rewriter.js +++ b/src/server/rewriter.js @@ -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 diff --git a/test/cli/index.js b/test/cli/index.js index b4d110d..cd8d23c 100644 --- a/test/cli/index.js +++ b/test/cli/index.js @@ -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) diff --git a/test/server/plural.js b/test/server/plural.js index 66c0576..9b8faa5 100644 --- a/test/server/plural.js +++ b/test/server/plural.js @@ -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))