Slide 1

Slide 1 text

Node.js+Mongoose+MongoDB Ͱ࡞ΔWebΞϓϦ Yusuke Ito, @novi_, Github: novi ؙͷ಺MongoDBษڧձ #12 in ೲྋ΋Μ͝ࡇΓ

Slide 2

Slide 2 text

CaseStudy: • ϒϩάΞϓϦΛ࡞ͬͯΈΔ • +؅ཧը໘΋࡞ͬͯΈΔ • DocumentͱEmbed DocumentΛ࢖༻ • Node.js+Express+MongoDB+Mongoose

Slide 3

Slide 3 text

σϞϓϩδΣΫτ https://github.com/novi/mongodiary

Slide 4

Slide 4 text

Agenda • Node • Express • MongooseͱMongoDB • ิ଍(πʔϧɺӡ༻पΓ)

Slide 5

Slide 5 text

Overview Node (Webαʔόʔ) Express ΞϓϦ ϑϨʔϜϫʔΫ MongoDB ODM Ϛούʔ OS ϒϥ΢β localhost: 3000

Slide 6

Slide 6 text

/PEFͷจԽ • υΩϡϝϯτΑΓ΋ιʔείʔυor ςετΛݟΔ(࠷ۙ͸υΩϡϝϯτ΋ଟ͍) • Ͱ͖Δ͚ͩγϯϓϧʹ • API΋؆ܿʹ • ଎͘(ಈ࡞ͱ։ൃεϐʔυ)

Slide 7

Slide 7 text

Α͍ͱ͜Ζ • γϯϓϧ • ଎͍ (ಈ࡞ͱ։ൃεϐʔυ) • ബ͍(ίʔυ΍ϥΠϒϥϦͷ૚) • σόοά΍ςετָ͕ • ϥΠϒϥϦͷ᠘ʹϋϚΓʹ͍͘

Slide 8

Slide 8 text

ܽ఺ • ѻ͍͕ଟগ೉͍͠(ΤϥʔॲཧͳͲ) • νʔϜͷٕज़Ϩϕϧɾ஌ࣝͷ͹Β͖ͭΛͲ͏཈͑ Δ͔ • ࿮૊Έͱͯ͠ͷϑϨʔϜϫʔΫΛϓϩδΣΫτ͝ͱ ʹ࡞Δඞཁ͕͋Δ • (ٯʹϓϩδΣΫτ͝ͱʹϑϨʔϜϫʔΫΛ࠷దԽ Ͱ͖Δͷ΋ັྗ) • ͦΕΛͣͬͱ΍͍ͬͯ͘ͱRailsʹ౸ୡ͢Δ...

Slide 9

Slide 9 text

ܽ఺ • ઃܭ(API, ϑΝΠϧߏ੒, ϑΝΠϧ෼ׂ) ͷܾ·Γ͕ແ͍ • ࣗ༝͚ͩͲϓϩδΣΫτ͝ͱʹϧʔϧ ͸ඞཁ • ಉ͘͡ϝϯςφϯε͢ΔਓͷεΩϧ ্ख͘࢖͑͹ɺ଎͞(։ൃεϐʔυ)ͱ଎͞ (ಈ࡞଎౓)Λ֫ಘͰ͖Δ

Slide 10

Slide 10 text

Hello World $ cat app.js console.log(‘Hello World’); $ node app Hello World

Slide 11

Slide 11 text

ϞδϡʔϧΛ࢖͏ app.js var fs = require(‘fs’); fs.readFile(‘hoge.txt’, ‘utf8’, function(err, data) { if (err) return console.error(err); console.log(data); });

Slide 12

Slide 12 text

8FCαʔόʔ var http = require('http'); var srv = http.createServer( function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }); srv.listen(1337);

Slide 13

Slide 13 text

Express • NodeͰWebΞϓϦΛ࡞ΔͨΊͷϑϨʔ ϜϫʔΫ • ϧʔςΟϯά+ϢʔςΟϦςΟ • node-connectϕʔε • Sinatra Inspired (ެࣜΑΓ)

Slide 14

Slide 14 text

ಛ௃ • جຊϓϩάϥϜͷ্͔ΒԼʹ࣮ߦ͞Ε Δ • ྫ֎΍ϧʔϧ(Rail)͸͋·Γແ͍ • Middleware͕ϙΠϯτ

Slide 15

Slide 15 text

Mongoose • ODM(Object-Document-Mapper) • RailsͰ͍͏ActiveRecordͷҐஔ෇͚ • MongoDB(node-mongodb-native)ͷബ͍ϥ ούʔ • εΩʔϚͱ؆୯ͳόϦσʔγϣϯ

Slide 16

Slide 16 text

Schema-less ??? http://blog.serverdensity.com/mongodb-schema-design-pitfalls/ c.f. εΩʔϚઃܭͷམͱ݀͠ͱίπ https://twitter.com/derickr/statuses/300984145662853120

Slide 17

Slide 17 text

εΩʔϚઃܭ • εΩʔϚઃܭ͸೉͍͠ • αʔϏεઃܭͱMongoDBͷ੍໿ͷ྆ํ ͔Βߟ͑Δඞཁ͕͋Δ • ͏·࣮͘૷Ͱ͖ΔͱߴύϑΥʔϚϯε

Slide 18

Slide 18 text

$BTF4UVEZϒϩάΞϓϦ • ͍ΘΏΔCMS(Content Management System) • Ӿཡը໘ͱ؅ཧը໘(/admin/*) • ίϝϯτͱLikeػೳ

Slide 19

Slide 19 text

ΦϒδΣΫτυΩϡϝϯτͷઃܭ Article Author •_id (ObjectId) •email (String) •name (String) •_id (ObjectId) •author (ObjectId) •title,body (String) •likeCount (Number) •comments [Array] Comment •text (String) •text (String) Comment ࿮಺͕Document Comment͕Embed Document models/*.js

Slide 20

Slide 20 text

ϙΠϯτ • 1 هࣄ = 1 Document • Document಺ʹCommentsͱlikeCountΛ಺แ • Document=هࣄΛফ͢ͱComments΋ಉ࣌ʹ ফ͑Δ(ઃܭʹΑΔޮՌ) • author͸ObjectIdʹΑΔࢀর • αʔϏεͷੑ্࣭τϥϯβΫγϣϯ΍atomicੑ ͸ඞཁͳ͍ͷͰ໰୊ແ͍

Slide 21

Slide 21 text

API • / GET • /article/:id GET • /article/:id/like POST • /article/:id/comments POST • /admin/* ҎԼ͸ཁϩάΠϯ • /login POST • /signup POST

Slide 22

Slide 22 text

• /admin/article POST(new) • /admin/articles GET • /admin/article/:id GET/POST (edit) • /admin/comments GET

Slide 23

Slide 23 text

Appendix

Slide 24

Slide 24 text

ӡ༻ྫ • ϑϩϯτ: nginx (port 80) • ϩΪϯά+CDN • ϦόʔεϓϩΩγ • ͏͠Ζ: NodeͷAppαʔόʔ × 1·ͨ͸N

Slide 25

Slide 25 text

nginx domain:80 js, css, png, jpeg, etc... ϦΫΤετ node localhost:3001 /login, API, etc... ϦόʔεϓϩΩγ • ϑϩϯτ(port 80)ʹWebαʔόʔ(nginxͳͲ)Λஔ͘ • ੩తϑΝΠϧ΍Ξηοτ(HTML, JS, CSS, ը૾)͸WebαʔόʔͰฦ͢ • ϩά΋WebαʔόʔͰग़ྗ͢Δ • ͦΕҎ֎ͷಈతHTML, JSON ϕʔεͷ API, WebSocketྨ͸Nodeʹϓϩ Ωγ͢Δ • ෛՙʹԠͯ͡NodeΞϓϦΛ૿΍͢

Slide 26

Slide 26 text

Callback ? Promise ? Fiber ? • ίʔϧόοΫ஍ࠈΛͲ͏͢Δ͔ʁ • Promise ͕ྑ͍͕ΤϥʔॲཧΛೖΕΔͱ݁ߏ ෳࡶʹͳΔ • synchronize(fiberͷϥούʔ)͕ྑ͍͔΋͠Ε ͳ͍(ݸਓతʹ͸ͬͪ͜Λ࢖༻) • 0.12.x͔ΒyieldʹରԠ (ωΠςΟϒͷfiber)

Slide 27

Slide 27 text

Tools • httpie (Ϟμϯcurl) • node-dev, node-inspector (σόοΨ) • grunt • bower • Mocha.js • http-node-proxy

Slide 28

Slide 28 text

ܕ • TypeScript͸༗๬ • JavaͷελΠϧʹ͍ۙ • ࠓ͸JSͰॻ͍ͯকདྷతʹt.dsͰܕ͚ͩ͸ ΊΔͷ΋Մೳ • ҆શੑ͓Αͼܕͱ͍͏υΩϡϝϯτ