RESTful Day #4: Custom URL Re-Writing/Routing using Attribute ...
Writing RESTful web services using Node.js
-
Upload
fdconf -
Category
Technology
-
view
23.448 -
download
5
description
Transcript of Writing RESTful web services using Node.js
![Page 1: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/1.jpg)
@jakobmattsson
![Page 2: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/2.jpg)
![Page 3: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/3.jpg)
Started out doing consulting
![Page 4: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/4.jpg)
3 startups:RecruitingAdvertisingFeedback
![Page 5: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/5.jpg)
2 000 000 000 writes/day!
![Page 6: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/6.jpg)
Back to square one
![Page 7: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/7.jpg)
Writing RESTfulweb servicesusing Node.js
![Page 8: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/8.jpg)
Comparison
Rocket science
Product demo
Silver bullet
![Page 9: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/9.jpg)
Comparison
Rocket science
Product demo
Silver bulletNOT
![Page 10: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/10.jpg)
What is it then?
![Page 11: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/11.jpg)
Imagination
Quantity
Bottom up
Principles
![Page 12: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/12.jpg)
Also... CoffeeScript
![Page 13: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/13.jpg)
Node.js
![Page 14: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/14.jpg)
![Page 15: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/15.jpg)
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast,
scalable network applications.
Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient,
perfect for data-intensive real-time applications that run across distributed devices.
![Page 16: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/16.jpg)
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast,
scalable network applications.
Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient,
perfect for data-intensive real-time applications that run across distributed devices.
![Page 17: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/17.jpg)
fs = require('fs')
fs.readFile 'meaning_of_life.txt', 'utf-8', (err, data) -> console.log(data)
console.log('end')
![Page 18: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/18.jpg)
end42
![Page 19: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/19.jpg)
Several protocols,including TCP and HTTP,
are built in to node.
![Page 20: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/20.jpg)
http = require('http')
onRequest = (req, res) -> res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end('Hello World\n')
http.createServer(onRequest).listen(1337)
![Page 21: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/21.jpg)
npm
![Page 22: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/22.jpg)
npm is a package manager for node.
You can use it to install and publish your node programs.
”It manages dependencies and does other cool stuff.”
![Page 23: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/23.jpg)
npm install underscore
![Page 24: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/24.jpg)
_ = require('underscore')numbers = _.range(1, 10)console.log(_.last(numbers))
![Page 25: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/25.jpg)
Connect
![Page 26: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/26.jpg)
Connect is a midleware framework for node.
It’s shipping with over 18 bundled middleware.
It has a rich selection of 3rd-party middleware.
![Page 27: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/27.jpg)
npm install connect
![Page 28: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/28.jpg)
connect = require('connect')app = connect()app.listen(3000)
// last line equivalent to // http.createServer(app).listen(3000);
![Page 29: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/29.jpg)
connect = require('connect')app = connect()
app.use connect.basicAuth (user, pass) -> return user == 'jakob' && pass == 'fdc13'
app.use (req, res) -> res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end('Hello World\n')
app.listen(3000)
![Page 30: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/30.jpg)
logger csrf
compress basicAuth
bodyParser json
urlencoded multipart
cookieParser session
cookieSession methodOverride
responseTime staticCache
static directory
vhost favicon
limit query
errorHandler
Request logger with custom format supportCross-site request forgery protectionGzip compression middlewareBasic http authenticationExtensible request body parserApplication/json parserApplication/x-www-form-urlencoded parserMultipart/form-data parserCookie parserSession management support with bundled MemoryStoreCookie-based session supportFaux HTTP method supportCalculates response-time and exposes via X-Response-TimeMemory cache layer for the static() middlewareStreaming static file server supporting Range and moreDirectory listing middlewareVirtual host sub-domain mapping middlewareEfficient favicon server (with default icon)Limit the bytesize of request bodiesAutomatic querystring parser, populating req.queryFlexible error handler
![Page 31: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/31.jpg)
Express
![Page 32: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/32.jpg)
High performancehigh class web development
for Node.js
![Page 33: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/33.jpg)
npm install express
![Page 34: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/34.jpg)
express = require('express')app = express.createServer()
app.get '/', (req, res) -> res.send('Hello World')
app.get '/users/:id', (req, res) -> res.send('user ' + req.params.id)
app.listen(3000)
![Page 35: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/35.jpg)
express = require('express')app = express.createServer()
before1 = (req, res, next) -> req.foo = 'bar' next()
before2 = (req, res, next) -> res.header('X-Time', new Date().getTime()) next()
app.get '/', before1, (req, res) -> res.send('Hello World')
app.get '/users/:id', [before1, before2], (req, res) -> console.log(req.foo) res.send('user ' + req.params.id)
app.listen(3000)
![Page 36: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/36.jpg)
Data storage
![Page 37: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/37.jpg)
But which one?
![Page 38: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/38.jpg)
Schemaless is a lie
![Page 39: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/39.jpg)
![Page 40: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/40.jpg)
Mongoose
![Page 41: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/41.jpg)
Mongoose is a MongoDB object modeling tool
designed to work in an asynchronous environment.
![Page 42: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/42.jpg)
npm install mongoose
![Page 43: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/43.jpg)
mongoose = require 'mongoose'
mongoose.connect 'mongodb://localhost/tamblr'
model = (name, schema) -> mongoose.model name, new mongoose.Schema schema, strict: true
users = model 'users' name: type: String default: '' bio: type: String default: 'IE6-lover' age: type: Number default: null
![Page 44: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/44.jpg)
blogs = model 'blogs' name: type: String default: '' description: type: String default: '' users: type: ObjectId ref: 'users'
![Page 45: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/45.jpg)
posts = model 'posts' title: type: String default: '' body: type: String default: '' published: type: Date blogs: type: ObjectId ref: 'blogs'
![Page 46: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/46.jpg)
list = (model, callback) -> model.find {}, callback
get = (model, id, callback) -> model.findById id, callback
del = (model, id, callback) -> model.remove { _id: id }, callback
put = (model, id, data, callback) -> model.update { _id: id }, data, { multi: false }, callback
post = (model, data, callback) -> new model(data).save callback
![Page 47: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/47.jpg)
app.get '/users/:id', (req, res) -> get users, req.params.id, (err, data) -> res.json data
![Page 48: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/48.jpg)
copy-paste!
![Page 49: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/49.jpg)
POST /usersGET /usersGET /users/42DELETE /users/42PUT /users/42
POST /blogsGET /blogsGET /blogs/42DELETE /blogs/42PUT /blogs/42
POST /postsGET /postsGET /posts/42DELETE /posts/42PUT /posts/42
![Page 50: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/50.jpg)
or should we?
![Page 51: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/51.jpg)
models = [users, blogs, posts]
Object.keys(models).forEach (modelName) ->
app.get "/#{modelName}", (req, res) -> list models[modelName], (err, data) -> res.json data
app.get "/#{modelName}/:id", (req, res) -> get models[modelName], req.params.id, (err, data) -> res.json data
app.post "/#{modelName}", (req, res) -> post models[modelName], req.body, (err, data) -> res.json data
app.del "/#{modelName}/:id", (req, res) -> del models[modelName], req.parmas.id, (err, count) -> res.json { count: count }
app.put "/#{modelName}/:id", (req, res) -> put models[modelName], req.params.id, req.body, (err, count) -> res.json { count: count }
![Page 52: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/52.jpg)
POST /usersGET /usersGET /users/42DELETE /users/42PUT /users/42
POST /blogsGET /blogsGET /blogs/42DELETE /blogs/42PUT /blogs/42
POST /postsGET /postsGET /posts/42DELETE /posts/42PUT /posts/42
![Page 53: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/53.jpg)
But what about the relations/associations?
![Page 54: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/54.jpg)
POST /users/42/blogsGET /users/42/blogs
POST /blogs/42/postsGET /blogs/42/posts
![Page 55: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/55.jpg)
paths = models[modelName].schema.pathsowners = Object.keys(paths).filter (p) -> paths[p].options.type == ObjectId && typeof paths[p].options.ref == 'string'.map (x) -> paths[x].options.ref
owners.forEach (owner) ->
app.get "/#{owner}/:id/#{name}", (req, res) -> listSub models[name], owner, req.params.id, (err, data) -> res.json data
app.post "/#{owner}/:id/#{name}", (req, res) -> postSub models[name], req.body, owner, req.params.id, (err, data) -> res.json data
![Page 56: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/56.jpg)
POST /users/42/blogsGET /users/42/blogs
POST /blogs/42/postsGET /blogs/42/posts
![Page 57: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/57.jpg)
Keep on generating!
![Page 58: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/58.jpg)
Authentication
![Page 59: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/59.jpg)
npm install passportnpm install passport-local
![Page 60: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/60.jpg)
passport = require('passport')passportLocal = require('passport-local')
passport.use new passportLocal.Strategy (user, pass, done) -> findUserPlz { username: user, password: pass }, (err, user) -> done(err, user)
app.use(passport.initialize())app.use(passport.authenticate('local'))
![Page 61: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/61.jpg)
npm install passport-twitter
![Page 62: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/62.jpg)
passport = require('passport')twitter = require('passport-twitter')
keys = { consumerKey: TWITTER_CONSUMER_KEY consumerSecret: TWITTER_CONSUMER_SECRET callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"}
passport.use new twitter.Strategy keys, (t, ts, profile, done) -> findOrCreateUserPlz { twitterId: profile.id }, (err, user) -> done(err, user)
app.use(passport.initialize())app.use(passport.authenticate('twitter'))
![Page 63: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/63.jpg)
Part 2Convention
![Page 64: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/64.jpg)
ALL CHARACTERS ANDEVENTS IN THIS SHOW--
EVENT THOSE BASED ON REALPEOPLE--ARE ENTIRELY FICTIONAL.
ALL CELEBERTY VOICES AREIMPERSONATED.....POORLY. THE
FOLLOWING PROGRAM CONTAINSCOARSE LANGUAGE AND DUE TOITS CONTENT IT SHOULD NOT BE
VIEWED BE ANYONE
![Page 65: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/65.jpg)
Verbs vs Nouns
![Page 66: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/66.jpg)
/users/users/42
/blogs/blogs/73
/posts/posts/314
![Page 67: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/67.jpg)
GET /usersGET /users/42
POST /users
PUT /users/42
DELETE /usersDELETE /users/42
![Page 68: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/68.jpg)
Associations
![Page 69: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/69.jpg)
/users/blogs/posts
![Page 70: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/70.jpg)
/users/blogs/posts
/users/42/blogs/blogs/314/posts
![Page 71: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/71.jpg)
/users/blogs/posts
/users/42/blogs/blogs/314/posts
/users/42/blogs/314/posts
![Page 72: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/72.jpg)
/users/blogs/posts
/users/42/blogs/blogs/314/posts
/users/42/blogs/314/posts
![Page 73: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/73.jpg)
/users/blogs/posts
/users/42/blogs/blogs/314/posts
/users/42/blogs/314/posts
Keep URLs short. Don’t overqualify.
![Page 74: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/74.jpg)
GET /blogs/42/posts?tag=javascript
![Page 75: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/75.jpg)
Versions
![Page 76: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/76.jpg)
GET /v1/users
![Page 77: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/77.jpg)
Partial responses
![Page 78: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/78.jpg)
GET /users?fields=email,age
GET /users?limit=10&offset=0
![Page 79: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/79.jpg)
Verbs
![Page 80: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/80.jpg)
/convert?from=EUR&to=BYR&amount=100
![Page 81: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/81.jpg)
Content-types
![Page 82: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/82.jpg)
GET /v1/users/42.xml
![Page 83: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/83.jpg)
Attributes
![Page 84: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/84.jpg)
{ "userId": 1, "firstName": "Jakob", "lastName": "Mattsson"}
![Page 85: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/85.jpg)
Search
![Page 86: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/86.jpg)
GET /search?q=javascriptGET /blog/42/posts?q=javascript
![Page 87: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/87.jpg)
Authentication
![Page 88: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/88.jpg)
Part 3Conclusion
![Page 89: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/89.jpg)
![Page 90: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/90.jpg)
It goes for ideas too!
Reuse convention.
![Page 91: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/91.jpg)
Reuse code.
Resuse ideas.
Build new things.
![Page 92: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/92.jpg)
![Page 93: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/93.jpg)
![Page 94: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/94.jpg)
”MOST IMPORTANT STEPFOR BUILD PRODUCTIS BUILD PRODUCT”
- @fakegrimlock
![Page 95: Writing RESTful web services using Node.js](https://reader038.fdocuments.us/reader038/viewer/2022102716/546568e5af7959871b8b6aa0/html5/thumbnails/95.jpg)
@jakobmattsson
Thank you!