Slide 1

Slide 1 text

Node.js ͷ ϥΠϒϥϦपΓͰ ϋϚͬͨ࿩ ksk1030 / 2018.06.29 @NodeֶԂ 31࣌ݶ໨

Slide 2

Slide 2 text

ࣗݾ঺հ ɾKeisuke Nakatane (@ksk1030) ɾORSO Inc. ৽نࣄۀ։ൃࣨ ɾαʔόɿΞϓϦɿϑϩϯτ ʹɹ̓ɹɿɹ̍ɹɿɹ̎ɹɹ͘Β͍ ɾલ৬͸ژ౎ͷήʔϜ԰Ͱਓࣄ

Slide 3

Slide 3 text

Node.js ͷ ϥΠϒϥϦपΓͰ ϋϚͬͨ࿩

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Sequelize ɾNode.js ༻ͷOR Mapper ɹ- http://docs.sequelizejs.com/ ɹ- Rails Ͱ͍͏Active Record ɾҰ൪ϝδϟʔͰ΍Γ͍ͨ͜ͱ͸Ͱ͖ͦ͏ ɾݹ͍৘ใ΋ώοτ͢ΔͷͰ஫ҙ (ver 3.x) ɹ- ࠷৽͸ ver 4.38 ͱ ver 5 Beta (2018/06/24)

Slide 6

Slide 6 text

ߏ੒͸ͬ͘͟Γ͜Μͳײ͡ ؅ཧπʔϧ ΞϓϦ DB ΞϓϦAPI ؅ཧπʔϧAPI

Slide 7

Slide 7 text

΍Ζ͏ͱͨ͜͠ͱ

Slide 8

Slide 8 text

λΠϜγϑτػೳ ɾσόοά༻ʹ staging ҎԼͰݱࡏ࣌ࠁΛ ɹِ૷͢Δػೳ ɾ؅ཧπʔϧ͔Β࣌ࠁΛߋ৽ ɾΞϓϦଆͷAPIͰ࣌ࠁࠩ෼Λద༻͢Δ

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Moment.js ɾΈΜͳେ޷͖೔෇ૢ࡞ܥϥΠϒϥϦ ɹ- ΋͸΍σϑΝΫτελϯμʔυͬΆ͍ ɾ࣌ؒͷॲཧ͸શͯ͜Ε wrap ͨ͠΋ͷʹ౷Ұ

Slide 11

Slide 11 text

ɾshiftSec ͕࣌ࠁͷࠩ෼ ͜Μͳײ͡Ͱwrapͨ͠ import moment from 'moment-timezone' import shiftSec from '../config/timeShift' if (process.env.NODE_ENV !== 'production') { moment.now = () => { return new Date().getTime() + shiftSec * 1000 } } export default moment

Slide 12

Slide 12 text

⚠໰୊ൃੜ⚠

Slide 13

Slide 13 text

Model ͷ Scope ͕ ػೳͯ͠ͳ͍ʁ

Slide 14

Slide 14 text

ɾSequelize ͷػೳ ɹ- http://docs.sequelizejs.com/manual/tutorial/scopes.html ɾڞ௨Խ͍ͨ͠ΫΤϦΛ model ʹఆ͓ٛͯ͘͠ ɹ- ʮϦϦʔε೔Λա͗ͨΧʔυʯͱ͔ Scope

Slide 15

Slide 15 text

ɾ$lte ͸ ” ≦ ”ʢLess Than or Equalʣ Scope const now = moment() const Card = sequelize.define('card', { // Attributes }, { scopes: { released: { where: { releasedAt: { $lte: now }, }, }, }, }) Card.scope(‘releasedAt').findAll() // ϦϦʔεޙͷΧʔυͷΈ

Slide 16

Slide 16 text

ɾmodel ͸ΞϓϦέʔγϣϯͷىಈ࣌ʹ ɹInitialize͞ΕΔ ɾScope ͸ͦͷ࣌఺ͷݱࡏ࣌ࠁΛݩʹੜ੒ ɾىಈޙʹ shiftSec ͕มΘͬͯ΋ߋ৽͞Εͳ͍ ݪҼ

Slide 17

Slide 17 text

Ͳ͏͠Α͏

Slide 18

Slide 18 text

ຖճҾ਺౉͢ʁ ɾείʔϓͷҾ਺Ͱͦͷ౓ʹݱࡏ࣌ࠁ౉ͤ͹ ɹରԠͰ͖Δ ɾ͕ɺ staging ҎԼͰ͔͠࢖Θͳ͍ػೳͷ ɹ͍ͤͰ৑௕Խ͢Δͷ΋ΠϠͩ

Slide 19

Slide 19 text

Ϟσϧߋ৽ ɾ࣌ࠁࠩ෼͕ߋ৽͞ΕͨΒϞσϧ΋ߋ৽͢Δ ɾͨͩ͠ɺ؅ཧπʔϧ༻APIͱΞϓϦ༻API͸ ɹผαʔόʹஔ͔Ε͍ͯΔ

Slide 20

Slide 20 text

ߏ੒͓͞Β͍ ؅ཧπʔϧ ΞϓϦ DB ΞϓϦAPI ؅ཧπʔϧAPI ߋ৽ϦΫΤετΛड͚Δ ϞσϧΛߋ৽͍ͨ͠

Slide 21

Slide 21 text

࠷ऴతʹ ɾDBͷϨίʔυͱɺϩʔΧϧϑΝΠϧʹ ɹshiftSec ʢݱࡏ࣌ࠁͱͷඵ਺ࠩʣΛ࣋ͭ ɾ؅ཧπʔϧͰߋ৽ͨ࣌͠఺Ͱ͸DBͷ஋͚ͩ ɹॻ͖׵Θ͍ͬͯΔ ɾΞΫηε͝ͱʹɺϩʔΧϧͱDBͷ shiftSec Λ ɹνΣοΫɺ͕ࠩ͋Ε͹ߋ৽

Slide 22

Slide 22 text

ͳΜͱ͔ͳͬͨ

Slide 23

Slide 23 text

՝୊ ɾϞσϧͷߋ৽ͱΞΫηε͝ͱͷࠩ෼νΣοΫ ɹͪ͠ΌͬͯΔ͕ॏ͍ ɹ- staging ҎԼͳͷͰ໰୊ʹ͸ͳΓʹ͍͘ ɾ΋ͬͱ͍͍ߏ੒͕͋Γͦ͏ ɹ- ஋Λ2ஈ֊Ͱ࣋ͬͯΔͷϒαΠΫ… ɹ- ϞσϧΛ෼཭ͨ͠ϚΠΫϩαʔϏεԽʁ ɾ͔ͯύοέʔδͱ͔ͳ͍ͷ͔…ʁ

Slide 24

Slide 24 text

ͪͳΈʹ

Slide 25

Slide 25 text

defaultScope

Slide 26

Slide 26 text

defaultScope ɾ໌ࣔతʹॲཧ͠ͳ͚Ε͹ࣗಈͰద༻ const Card = sequelize.define('card', { // Attributes }, { defaultScope: { where: { isActive: true, }, }, }) Card.findAll() // scope ͷࢦఆͳ͠Ͱ acitve ͷΈ

Slide 27

Slide 27 text

ศརʹݟ͑Δ͕ Rails ք۾Ͱ͸

Slide 28

Slide 28 text

"ېஅͷՌ࣮"

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

"ېஅͷՌ࣮" ېढ

Slide 32

Slide 32 text

Active Record Ͱ͸ ɾ෭࡞༻͕ଟ͍ ɹ- ஌Β͵ؒʹϑΟϧλϦϯά͞ΕΔ ɹ- unscoped ͢Δͱଞͷ৚݅΋Ϧηοτ ɹ- Πϯελϯεੜ੒࣌ʹ default ஋͕ೖΔ

Slide 33

Slide 33 text

͜Μͳײ͡ ʢ࣌ؒ଍Βͣݕূෆे෼Ͱ͢ɻɻɻʣ class User < ApplicationRecord has_many :friends end class Friend < ApplicationRecord belongs_to :user default_scope -> { where(is_goodlooking: true) } end User.first.friends # ͨͩ͠ΠέϝϯʹݶΔ User.first.friends.unscoped # “.first” ͷߜΓࠐΈ͕ແࢹ͞ΕΔ Friend.new # ࠷ॳ͔ΒΠέϝϯ

Slide 34

Slide 34 text

Sequelize Ͱ͸ Ͳ͏ͳͷ͔ʁ

Slide 35

Slide 35 text

ҙ֎ͱେৎ෉ͬΆ͍͔…ʁ ɾunscope ͱ default஋ͷ໰୊͸ΫϦΞ // ϢʔβͷߜΓࠐΈ͸ޮ͍ͨ·· const firstUser = await User.findOne() firstUser.findAll({ include: [{ model: Friend.unscoped() }], }) const newFriend = Friend.build() // { id: null }

Slide 36

Slide 36 text

݁ہͲ͏ͳͷʁ ɾ஌Β͵ؒʹϑΟϧλϦϯά͞ΕΔɺͱ͍͏ ɹέʔε͸ग़ͯ͘Δ ɹ- ΍͸Γཚ༻͸ݫېʂʂ❌ ɹ- ࢖͏ͱͨ͠ΒɺϦϦʔε࣌ࠁ·Ͱຊ൪؀ڥʹ ɹ ઈରग़ͪ͠Ό͍͚ͳ͍෺ʹ Soft Delete తʹ ʢ- Soft Delete ࣗମͷੋඇ΋͋Δʣ ɾ๻ͷ஌Βͳ͍᠘͕·ͩ·ͩ͋Γͦ͏ͳ ɹؾ΋͢ΔͷͰੋඇڭ͍͑ͯͩ͘͞…$

Slide 37

Slide 37 text

Enjoy your ɹ Node.js life …