Skip to content

Commit 5ebfc73

Browse files
committed
Add /api route with an example todos route
1 parent 3a305ad commit 5ebfc73

File tree

5 files changed

+105
-1
lines changed

5 files changed

+105
-1
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
"babel-preset-es2015": "^6.24.1",
123123
"babel-preset-react": "^6.24.1",
124124
"babel-register": "^6.24.1",
125+
"body-parser": "^1.17.2",
125126
"classnames": "^2.2.5",
126127
"compression": "^1.6.2",
127128
"compression-webpack-plugin": "^0.4.0",

server/api/index.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import express from 'express';
2+
import bodyParser from 'body-parser';
3+
import todos from './todos';
4+
5+
const Api = express();
6+
7+
// always send JSON headers
8+
Api.use((req, res, next) => {
9+
res.contentType('application/json');
10+
next();
11+
});
12+
13+
// parse JSON body
14+
Api.use(bodyParser.json());
15+
16+
// Add all API endpoints here
17+
Api.use('/todos', todos);
18+
19+
export default Api;

server/api/todos.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import express from 'express';
2+
3+
const router = express.Router();
4+
5+
router.get('/', (req, res) => {
6+
// Replace this with an actual fetch from a database
7+
return res.json([
8+
{
9+
id: 1,
10+
text: 'Learn React',
11+
completed: true
12+
},
13+
{
14+
id: 2,
15+
text: 'Learn Redux',
16+
completed: true
17+
},
18+
{
19+
id: 3,
20+
text: 'Build an app',
21+
completed: false
22+
}
23+
]);
24+
});
25+
26+
export default router;

server/server.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import configureStore from 'store';
1111
import serveStatic from 'serve-static';
1212
import compression from 'compression';
1313
import App from 'containers/App';
14+
import Api from './api';
1415

1516
const app = new Express();
1617
const port = config.port;
@@ -21,6 +22,9 @@ app.use(compression());
2122
// Use this middleware to serve up static files built into dist
2223
app.use('/dist', serveStatic(path.join(__dirname, '../dist')));
2324

25+
// Mount the REST API
26+
app.use('/api', Api);
27+
2428
// This is fired every time the server side receives a request
2529
app.use(handleRender);
2630

yarn.lock

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,21 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
920920
version "4.11.6"
921921
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
922922

923+
body-parser@^1.17.2:
924+
version "1.17.2"
925+
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
926+
dependencies:
927+
bytes "2.4.0"
928+
content-type "~1.0.2"
929+
debug "2.6.7"
930+
depd "~1.1.0"
931+
http-errors "~1.6.1"
932+
iconv-lite "0.4.15"
933+
on-finished "~2.3.0"
934+
qs "6.4.0"
935+
raw-body "~2.2.0"
936+
type-is "~1.6.15"
937+
923938
boom@2.x.x:
924939
version "2.10.1"
925940
resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
@@ -1049,6 +1064,10 @@ bytes@2.3.0:
10491064
version "2.3.0"
10501065
resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070"
10511066

1067+
bytes@2.4.0:
1068+
version "2.4.0"
1069+
resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
1070+
10521071
caller-path@^0.1.0:
10531072
version "0.1.0"
10541073
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
@@ -1587,6 +1606,12 @@ debug@2.6.1, debug@^2.1.1, debug@^2.2.0, debug@^2.6.0:
15871606
dependencies:
15881607
ms "0.7.2"
15891608

1609+
debug@2.6.7:
1610+
version "2.6.7"
1611+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
1612+
dependencies:
1613+
ms "2.0.0"
1614+
15901615
debug@^2.6.3, debug@^2.6.8:
15911616
version "2.6.8"
15921617
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
@@ -2633,6 +2658,10 @@ https-browserify@0.0.1:
26332658
version "0.0.1"
26342659
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
26352660

2661+
iconv-lite@0.4.15:
2662+
version "0.4.15"
2663+
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
2664+
26362665
iconv-lite@^0.4.17:
26372666
version "0.4.18"
26382667
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2"
@@ -3382,12 +3411,22 @@ miller-rabin@^4.0.0:
33823411
version "1.26.0"
33833412
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff"
33843413

3414+
mime-db@~1.29.0:
3415+
version "1.29.0"
3416+
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878"
3417+
33853418
mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7:
33863419
version "2.1.14"
33873420
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee"
33883421
dependencies:
33893422
mime-db "~1.26.0"
33903423

3424+
mime-types@~2.1.15:
3425+
version "2.1.16"
3426+
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23"
3427+
dependencies:
3428+
mime-db "~1.29.0"
3429+
33913430
mime@1.3.4, mime@1.3.x, mime@^1.3.4:
33923431
version "1.3.4"
33933432
resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
@@ -4318,6 +4357,14 @@ range-parser@^1.0.3, range-parser@~1.2.0:
43184357
version "1.2.0"
43194358
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
43204359

4360+
raw-body@~2.2.0:
4361+
version "2.2.0"
4362+
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
4363+
dependencies:
4364+
bytes "2.4.0"
4365+
iconv-lite "0.4.15"
4366+
unpipe "1.0.0"
4367+
43214368
rc@^1.0.1, rc@~1.1.0:
43224369
version "1.1.6"
43234370
resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9"
@@ -5350,6 +5397,13 @@ type-is@~1.6.14:
53505397
media-typer "0.3.0"
53515398
mime-types "~2.1.13"
53525399

5400+
type-is@~1.6.15:
5401+
version "1.6.15"
5402+
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
5403+
dependencies:
5404+
media-typer "0.3.0"
5405+
mime-types "~2.1.15"
5406+
53535407
typedarray@^0.0.6:
53545408
version "0.0.6"
53555409
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -5414,7 +5468,7 @@ uniqs@^2.0.0:
54145468
version "2.0.0"
54155469
resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
54165470

5417-
unpipe@~1.0.0:
5471+
unpipe@1.0.0, unpipe@~1.0.0:
54185472
version "1.0.0"
54195473
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
54205474

0 commit comments

Comments
 (0)