Nodejsによるapiサーバ構築事例

Hidetoshi Mori
Hidetoshi MoriSelf-Employed Consultant at home
node.jsによるAPIサーバ構築
                     h_mori




13年4月18日木曜日
自己紹介
              • 森 英寿(プログラマ)
                 hidetoshi.mori
                 @h_mori

               SOICHA/TweetMe
               ATND暦/生存連絡



13年4月18日木曜日
背景

              • iOSアプリから利用するAPIサーバ構築
              • API認証基盤を作る
              • PushNotificationを発行


13年4月18日木曜日
node.jsを利用した経緯

              • MongoDBのRESTオプションによる構築
              • 後から認証基盤を追加実装
              • 後からPushNotificationを実装


13年4月18日木曜日
データモデル
              • DataList (トランザクション)
              • User (アカウント情報) ※追加
              • Device (端末情報) ※追加
              • Group (ユーザカテゴリ) ※追加

13年4月18日木曜日
サーバ構成

              • MongoDB
              • restify
              • Mongoose


13年4月18日木曜日
MongoDB?

         • NoSQL
         • ドキュメント指向DB(スキーマレス)
         • where, like検索, 集計関数も可能


13年4月18日木曜日
苦手なこと
         • トランザクション制御
          (アトミック性は保証)

         • リレーショナル、一意制約等


13年4月18日木曜日
DB構造

         • DBS > Collection > Object
              (Database)   (Scheme)   (Record)




13年4月18日木曜日
メリット

         •    起動オプションにREST I/Fがある

         •    JSONとの親和性が高い

         •    WebAPI化しやすい




13年4月18日木曜日
有用なケース

         •    トランザクション制御が不要

         •    大量書き込みが想定される

         •    データの一意制約が不要




13年4月18日木曜日
導入

         •    $ brew install mongodb

         •    $ port install mongodb

         •    mongodb.orgからDLして任意のフォルダに展開




13年4月18日木曜日
DBサーバ起動


         •    $ ./bin/mongod -dbpath=db/ --rest
               ※RESTオプション付き

               ※28017ポートでWebAPIが起動




13年4月18日木曜日
DBクライアント



         •    $ ./bin/mongo
               GUI clientも存在するがメリットは薄い




13年4月18日木曜日
URLアクセス


         •    curl 'http://localhost:28017/testdb/hoge'

         •    curl -d "{'user':'test'}" 'http://localhost:28017/testdb/hoge'




13年4月18日木曜日
restify ?

              • RESTに特化したnode.jsモジュール
              • Expressを軽量化したようなもの


13年4月18日木曜日
restifyの主な機能
              •   Routing

              •   Header Parser / Error handler

              •   JSONP/JSON support

              •   GZIP support

              •   URL-encoder

              •   multipart form



13年4月18日木曜日
restify導入


              • $ npm install restify
              • var restify = require('restify');


13年4月18日木曜日
Routing
              var restify = require('restify');
              var server = restify.createServer();
              server.use(restify.queryParser());
              function send(req, res, next) {
                 res.send('hello ' + req.params.name);
                 return next();
              }
              server.post('/hello', function create(req, res, next) {
                 res.send(201, Math.random().toString(36).substr(3, 8));
                 return next();
              });
              server.get('/hello/:name', send);
              server.head('/hello/:name', send);
              server.del('hello/:name', function rm(req, res, next) {
                res.send(204);
                return next();
              });



13年4月18日木曜日
Mongoose ?
              • MongoDB用ドライバ
              • Object Modeling Tool (O/Rマッパ)
              • DBコネクションのバッファリング
              • Validator、Defaults、Index等の定義可

13年4月18日木曜日
Mongooseの使用例
              var UserSchema = new mongoose.Schema({
                  email:{
                     type: String,
                     unique: true,
                     index: true
                  },
                  password:String,
                  created_at:{type: Date, default: Date.now},
                  updated_at:{type: Date, default: Date.now}
              });
              UserSchema.pre('save', function(next) {
                  this.updated_at = Date.now();
                  next();
              });
              var User = mongoose.model('user', UserSchema);




13年4月18日木曜日
Mongoose導入


              • $ npm install mongoose
              • var mongoose = require('mongoose');


13年4月18日木曜日
cloud9 IDE
              • ブラウザベースIDE
              • クラウド上にプライベート領域を作れる
               (github,bitbucket,heroku等と連携)

              • Node.js、PHP、Java、Ruby等をサポート

13年4月18日木曜日
cloud9 IDE 導入

              • ローカル環境にインストールも可能
              • $ git clone https://github.com/ajaxorg/
                cloud9.git cloud9
              • sudo ./cloud9/bin/cloud9.sh


13年4月18日木曜日
cloud9 IDEの起動


              • ./bin/cloud9.sh -w {workspace_dir} で起動
              • http://localhost:3131 にアクセス


13年4月18日木曜日
認証方式


              • SSL + Basic認証 + sha1(solt)



13年4月18日木曜日
restify.authorizationParser
              • server.use(restify.authorizationParser());
              • req.authorization オブジェクト
                {
                    scheme: <Basic|Signature|...>,
                    credentials: <Undecoded value of header>,
                    basic: {
                      username: $user
                      password: $password
                    }
                }




13年4月18日木曜日
認証基盤の実装
              server.use(function authenticate(req, res, next) {
                  if (!req.authorization.basic) {
                      res.header('WWW-Authenticate', 'Basic realm=""');
                      res.send(401);
                      return next(false);
                  }
                  User.findOne({email:req.username}, function (err, user) {
                      if (err) { return next(err); }
                      if (!user && user.password !== req.authorization.basic.password) {
                          return next(new restify.NotAuthorizedError());
                      }
                      return next();
                  });
              });




13年4月18日木曜日
実装上の注意
              • I/O系関数は処理順序を保証しない
               var user = User.findOne({email:req.params.email});
               user.password = req.params.password;
               user.save();
               res.send(user);




13年4月18日木曜日
実装上の注意
              • 必ずコールバックにて処理
               User.findOne({email:req.params.email}, function(err, user) {
                 user.password = req.params.password;
                 user.save(function(arr, data)) {
                      res.send(data);
                 });
               }




13年4月18日木曜日
実装上の注意
              • 複雑な処理の同期が必要な場合は外部
               モジュールを検討する
               ‣ async.js
               ‣ node-fibers
               ‣ flow-js
               ‣ step

13年4月18日木曜日
実装して思ったこと

              •   非同期処理が不要な場合node.jsは向かない 
                  (client, middlewareにロジックを置く場合は有)

              •   MongoDBと簡易JsonAPIは相性がいい

              •   node.jsと関連モジュールはまだまだ過渡期




13年4月18日木曜日
1 of 32

Recommended

汎用apiサーバの構築 by
汎用apiサーバの構築汎用apiサーバの構築
汎用apiサーバの構築Hidetoshi Mori
2K views13 slides
MongoDBではじめるカジュアルなタイムラインシステム by
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムHitoshi Asai
8.7K views34 slides
エコなWebサーバー by
エコなWebサーバーエコなWebサーバー
エコなWebサーバーemasaka
691 views30 slides
MongoDB on EC2 #mongodbcasual by
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualYasuhiro Matsuo
7.6K views28 slides
ブログの執筆環境をタスクランナーで自動化してみる by
ブログの執筆環境をタスクランナーで自動化してみるブログの執筆環境をタスクランナーで自動化してみる
ブログの執筆環境をタスクランナーで自動化してみるAkira N
1.2K views25 slides
45分で理解する webクローリング入門 斉藤之雄 by
45分で理解する webクローリング入門 斉藤之雄45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄Yukio Saito
10.9K views14 slides

More Related Content

What's hot

実践スクレイピング by
実践スクレイピング実践スクレイピング
実践スクレイピングだいすけ ふるかわ
32.6K views74 slides
Pythonで検索エンジン2 by
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2Yasukazu Kawasaki
1.9K views25 slides
Tour of Scraping by
Tour of ScrapingTour of Scraping
Tour of ScrapingKenta Yonekura
26K views34 slides
Casual Compression on MongoDB by
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDBmoai kids
11K views46 slides
Reactjs by
ReactjsReactjs
Reactjsしくみ製作所
2.2K views18 slides
MongoDBCSharp by
MongoDBCSharpMongoDBCSharp
MongoDBCSharpytanno
703 views13 slides

What's hot(20)

Casual Compression on MongoDB by moai kids
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDB
moai kids11K views
MongoDBCSharp by ytanno
MongoDBCSharpMongoDBCSharp
MongoDBCSharp
ytanno703 views
Ossで作るwebサイト by Soudai Sone
Ossで作るwebサイトOssで作るwebサイト
Ossで作るwebサイト
Soudai Sone1.3K views
Next-L Enju 開発ワークショップ #8 by Kosuke Tanabe
Next-L Enju 開発ワークショップ #8Next-L Enju 開発ワークショップ #8
Next-L Enju 開発ワークショップ #8
Kosuke Tanabe874 views
コロナ禍の所蔵品検索システム by Naosuke Okamoto
コロナ禍の所蔵品検索システムコロナ禍の所蔵品検索システム
コロナ禍の所蔵品検索システム
Naosuke Okamoto46 views
[大図解]ピグライフはこう動いている by Akihiro Kuwano
[大図解]ピグライフはこう動いている[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている
Akihiro Kuwano12.3K views
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会) by parrotstudio
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
parrotstudio1.2K views
Mongo db勉強会の補足 by CROOZ, inc.
Mongo db勉強会の補足Mongo db勉強会の補足
Mongo db勉強会の補足
CROOZ, inc.5.4K views
スマートWordPress on JAWS-UG Tokyo#17 by Hiro Fukami
スマートWordPress on JAWS-UG Tokyo#17スマートWordPress on JAWS-UG Tokyo#17
スマートWordPress on JAWS-UG Tokyo#17
Hiro Fukami4.8K views
Lt by LGA128
LtLt
Lt
LGA128555 views
CyberAgentにおけるMongoDB by Akihiro Kuwano
CyberAgentにおけるMongoDBCyberAgentにおけるMongoDB
CyberAgentにおけるMongoDB
Akihiro Kuwano17.7K views
MongoDB〜その性質と利用場面〜 by Naruhiko Ogasawara
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
Naruhiko Ogasawara65.2K views

Viewers also liked

サーバサイドNodeの使い道 by
サーバサイドNodeの使い道サーバサイドNodeの使い道
サーバサイドNodeの使い道pospome
10.7K views99 slides
Node.js を選ぶとき 選ばないとき by
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときRyunosuke SATO
83.2K views102 slides
Node.js基礎の基礎 - Miyazaki.js vol.2 by
Node.js基礎の基礎 - Miyazaki.js vol.2Node.js基礎の基礎 - Miyazaki.js vol.2
Node.js基礎の基礎 - Miyazaki.js vol.2Nobuhiro Nakashima
14.5K views36 slides
Bluemixと既存システムとの連携 by
Bluemixと既存システムとの連携Bluemixと既存システムとの連携
Bluemixと既存システムとの連携IBMソリューション
4.9K views44 slides
Nodeについて by
NodeについてNodeについて
NodeについてNatsuki Yamanaka
15.9K views23 slides
Node.js入門 by
Node.js入門Node.js入門
Node.js入門俊夫 森
30.7K views50 slides

Viewers also liked(20)

サーバサイドNodeの使い道 by pospome
サーバサイドNodeの使い道サーバサイドNodeの使い道
サーバサイドNodeの使い道
pospome10.7K views
Node.js を選ぶとき 選ばないとき by Ryunosuke SATO
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないとき
Ryunosuke SATO83.2K views
Node.js基礎の基礎 - Miyazaki.js vol.2 by Nobuhiro Nakashima
Node.js基礎の基礎 - Miyazaki.js vol.2Node.js基礎の基礎 - Miyazaki.js vol.2
Node.js基礎の基礎 - Miyazaki.js vol.2
Nobuhiro Nakashima14.5K views
Node.js入門 by 俊夫 森
Node.js入門Node.js入門
Node.js入門
俊夫 森30.7K views
IBM Bluemix infrastructure SoftLayer はじめての見積もりの仕方 softlayer by Kazuhiko Isaji
IBM Bluemix infrastructure SoftLayer はじめての見積もりの仕方  softlayerIBM Bluemix infrastructure SoftLayer はじめての見積もりの仕方  softlayer
IBM Bluemix infrastructure SoftLayer はじめての見積もりの仕方 softlayer
Kazuhiko Isaji1.7K views
Bluemix_API_Possibility by Harada Kazuki
Bluemix_API_PossibilityBluemix_API_Possibility
Bluemix_API_Possibility
Harada Kazuki2.2K views
スマホアプリ開発者のためのWeb api開発入門の入門 by Kenyu Miura
スマホアプリ開発者のためのWeb api開発入門の入門スマホアプリ開発者のためのWeb api開発入門の入門
スマホアプリ開発者のためのWeb api開発入門の入門
Kenyu Miura34.6K views
BluemixとIBM DevOps Servicesで始めるアプリケーション開発 by IBMソリューション
BluemixとIBM DevOps Servicesで始めるアプリケーション開発BluemixとIBM DevOps Servicesで始めるアプリケーション開発
BluemixとIBM DevOps Servicesで始めるアプリケーション開発
【共通版】 IBM Cloud (SoftLayer) 最新動向情報 2017年11月版 v1.0 by Kazuhiko Isaji
【共通版】 IBM Cloud (SoftLayer) 最新動向情報 2017年11月版 v1.0【共通版】 IBM Cloud (SoftLayer) 最新動向情報 2017年11月版 v1.0
【共通版】 IBM Cloud (SoftLayer) 最新動向情報 2017年11月版 v1.0
Kazuhiko Isaji19.9K views
未来のwebに欠かせないREST APIをApache Solr + Drupal8で実装しよう@PHPカンファレンス2016 東京 by Masayuki Abe
未来のwebに欠かせないREST APIをApache Solr + Drupal8で実装しよう@PHPカンファレンス2016 東京未来のwebに欠かせないREST APIをApache Solr + Drupal8で実装しよう@PHPカンファレンス2016 東京
未来のwebに欠かせないREST APIをApache Solr + Drupal8で実装しよう@PHPカンファレンス2016 東京
Masayuki Abe16.3K views
【初心者向け】Go言語勉強会資料 by Yuji Otani
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
Yuji Otani37.1K views
Node Foundation Membership Overview 20160907 by NodejsFoundation
Node Foundation Membership Overview 20160907Node Foundation Membership Overview 20160907
Node Foundation Membership Overview 20160907
NodejsFoundation1.1M views
”もと”中の人が語り尽くすSoftLayerセキュリティー(2016/10/13更新版) by Shinobu Yasuda
”もと”中の人が語り尽くすSoftLayerセキュリティー(2016/10/13更新版)”もと”中の人が語り尽くすSoftLayerセキュリティー(2016/10/13更新版)
”もと”中の人が語り尽くすSoftLayerセキュリティー(2016/10/13更新版)
Shinobu Yasuda10.3K views
The Enterprise Case for Node.js by NodejsFoundation
The Enterprise Case for Node.jsThe Enterprise Case for Node.js
The Enterprise Case for Node.js
NodejsFoundation49.5K views

Similar to Nodejsによるapiサーバ構築事例

Movable Type 6 Overview - New York Perl Mongers Tech Talk by
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkYuji Takayama
27.1K views43 slides
大(中)規模Java script開発について by
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発についてYuki Tanaka
3.9K views43 slides
Word press on conoha このべん #3 by
Word press on conoha このべん #3Word press on conoha このべん #3
Word press on conoha このべん #3Wataru OKAMOTO
3.8K views65 slides
20130412 titanium meetupvol7 by
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7Hiroshi Oyamada
1.3K views21 slides
Hakyllで遊んでみた。 by
Hakyllで遊んでみた。Hakyllで遊んでみた。
Hakyllで遊んでみた。Tomohiko Himura
2.7K views32 slides
Djangoフレームワークの紹介 by
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
72.9K views47 slides

Similar to Nodejsによるapiサーバ構築事例(20)

Movable Type 6 Overview - New York Perl Mongers Tech Talk by Yuji Takayama
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech Talk
Yuji Takayama27.1K views
大(中)規模Java script開発について by Yuki Tanaka
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発について
Yuki Tanaka3.9K views
Word press on conoha このべん #3 by Wataru OKAMOTO
Word press on conoha このべん #3Word press on conoha このべん #3
Word press on conoha このべん #3
Wataru OKAMOTO3.8K views
Djangoフレームワークの紹介 by Shinya Okano
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
Shinya Okano72.9K views
初めての Data api cms どうでしょう - 大阪夏の陣 by Yuji Takayama
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama1.5K views
第1回鹿児島node.jsの会資料_内村 by Koichi Uchimura
第1回鹿児島node.jsの会資料_内村第1回鹿児島node.jsの会資料_内村
第1回鹿児島node.jsの会資料_内村
Koichi Uchimura2.3K views
初めての Data API CMS どうでしょう - 仙台編 - by Yuji Takayama
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama4.8K views
Mysql casual talks vol4 by matsuo kenji
Mysql casual talks vol4Mysql casual talks vol4
Mysql casual talks vol4
matsuo kenji5K views
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016 by Takayuki Shimizukawa
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
EmbulkとDigdagとデータ分析基盤と by Toru Takahashi
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
Toru Takahashi22.5K views
EmbulkとDigdagとデータ分析基盤と by Toru Takahashi
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
Toru Takahashi918 views
Data api workshop at Co-Edo by Yuji Takayama
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama4.9K views
Express Web Application Framework by LearningTech
Express Web Application FrameworkExpress Web Application Framework
Express Web Application Framework
LearningTech667 views
Spring data-rest-and-spring-cloud-contract by Takeshi Ogawa
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
Takeshi Ogawa8.6K views
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方 by linzhixing
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing3.6K views
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた by Yuki Takei
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
Yuki Takei21.3K views
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜 by Takahiro Inoue
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Takahiro Inoue43.2K views

More from Hidetoshi Mori

Photo mosaic 検証 by
Photo mosaic 検証Photo mosaic 検証
Photo mosaic 検証Hidetoshi Mori
430 views29 slides
プロジェクト管理しないという提案 by
プロジェクト管理しないという提案プロジェクト管理しないという提案
プロジェクト管理しないという提案Hidetoshi Mori
2K views41 slides
Git超入門 by
Git超入門Git超入門
Git超入門Hidetoshi Mori
2.5K views17 slides
20130515 diary euglena_en by
20130515 diary euglena_en20130515 diary euglena_en
20130515 diary euglena_enHidetoshi Mori
1.2K views13 slides
Evernote連携 by
Evernote連携Evernote連携
Evernote連携Hidetoshi Mori
4.6K views11 slides
コンシューマアプリを作るということ by
コンシューマアプリを作るということコンシューマアプリを作るということ
コンシューマアプリを作るということHidetoshi Mori
3.4K views15 slides

More from Hidetoshi Mori(20)

プロジェクト管理しないという提案 by Hidetoshi Mori
プロジェクト管理しないという提案プロジェクト管理しないという提案
プロジェクト管理しないという提案
Hidetoshi Mori2K views
20130515 diary euglena_en by Hidetoshi Mori
20130515 diary euglena_en20130515 diary euglena_en
20130515 diary euglena_en
Hidetoshi Mori1.2K views
コンシューマアプリを作るということ by Hidetoshi Mori
コンシューマアプリを作るということコンシューマアプリを作るということ
コンシューマアプリを作るということ
Hidetoshi Mori3.4K views
mongodbの簡易ストレージ化 by Hidetoshi Mori
mongodbの簡易ストレージ化mongodbの簡易ストレージ化
mongodbの簡易ストレージ化
Hidetoshi Mori828 views
UITableViewで無限CoverFlowを作る by Hidetoshi Mori
UITableViewで無限CoverFlowを作るUITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作る
Hidetoshi Mori3.8K views
モバイルビジネスの動向 by Hidetoshi Mori
モバイルビジネスの動向モバイルビジネスの動向
モバイルビジネスの動向
Hidetoshi Mori2.6K views
インタラクションデザインの考察 by Hidetoshi Mori
インタラクションデザインの考察インタラクションデザインの考察
インタラクションデザインの考察
Hidetoshi Mori773 views
モバイルビジネスの動向 by Hidetoshi Mori
モバイルビジネスの動向モバイルビジネスの動向
モバイルビジネスの動向
Hidetoshi Mori614 views
サービス開発における工程 by Hidetoshi Mori
サービス開発における工程サービス開発における工程
サービス開発における工程
Hidetoshi Mori1.4K views
ゲリラ的サービスの育て方 by Hidetoshi Mori
ゲリラ的サービスの育て方ゲリラ的サービスの育て方
ゲリラ的サービスの育て方
Hidetoshi Mori898 views
インタラクションデザインの考察 by Hidetoshi Mori
インタラクションデザインの考察インタラクションデザインの考察
インタラクションデザインの考察
Hidetoshi Mori879 views
Presentation of TapkuLibrary by Hidetoshi Mori
Presentation of TapkuLibraryPresentation of TapkuLibrary
Presentation of TapkuLibrary
Hidetoshi Mori1.9K views

Recently uploaded

01Booster Studio ご紹介資料 by
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料ssusere7a2172
300 views19 slides
さくらのひやおろし2023 by
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023法林浩之
91 views58 slides
The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
41 views29 slides
Web3 Career_クレデン資料 .pdf by
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdfnanamatsuo
14 views9 slides
JJUG CCC.pptx by
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 views14 slides
SSH応用編_20231129.pdf by
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdficebreaker4
172 views13 slides

Recently uploaded(12)

01Booster Studio ご紹介資料 by ssusere7a2172
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料
ssusere7a2172300 views
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之91 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.41 views
Web3 Career_クレデン資料 .pdf by nanamatsuo
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdf
nanamatsuo14 views
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4172 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda175 views
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by Knowledge & Experience
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka71 views

Nodejsによるapiサーバ構築事例

  • 1. node.jsによるAPIサーバ構築 h_mori 13年4月18日木曜日
  • 2. 自己紹介 • 森 英寿(プログラマ) hidetoshi.mori @h_mori SOICHA/TweetMe ATND暦/生存連絡 13年4月18日木曜日
  • 3. 背景 • iOSアプリから利用するAPIサーバ構築 • API認証基盤を作る • PushNotificationを発行 13年4月18日木曜日
  • 4. node.jsを利用した経緯 • MongoDBのRESTオプションによる構築 • 後から認証基盤を追加実装 • 後からPushNotificationを実装 13年4月18日木曜日
  • 5. データモデル • DataList (トランザクション) • User (アカウント情報) ※追加 • Device (端末情報) ※追加 • Group (ユーザカテゴリ) ※追加 13年4月18日木曜日
  • 6. サーバ構成 • MongoDB • restify • Mongoose 13年4月18日木曜日
  • 7. MongoDB? • NoSQL • ドキュメント指向DB(スキーマレス) • where, like検索, 集計関数も可能 13年4月18日木曜日
  • 8. 苦手なこと • トランザクション制御  (アトミック性は保証) • リレーショナル、一意制約等 13年4月18日木曜日
  • 9. DB構造 • DBS > Collection > Object (Database) (Scheme) (Record) 13年4月18日木曜日
  • 10. メリット • 起動オプションにREST I/Fがある • JSONとの親和性が高い • WebAPI化しやすい 13年4月18日木曜日
  • 11. 有用なケース • トランザクション制御が不要 • 大量書き込みが想定される • データの一意制約が不要 13年4月18日木曜日
  • 12. 導入 • $ brew install mongodb • $ port install mongodb • mongodb.orgからDLして任意のフォルダに展開 13年4月18日木曜日
  • 13. DBサーバ起動 • $ ./bin/mongod -dbpath=db/ --rest  ※RESTオプション付き ※28017ポートでWebAPIが起動 13年4月18日木曜日
  • 14. DBクライアント • $ ./bin/mongo GUI clientも存在するがメリットは薄い 13年4月18日木曜日
  • 15. URLアクセス • curl 'http://localhost:28017/testdb/hoge' • curl -d "{'user':'test'}" 'http://localhost:28017/testdb/hoge' 13年4月18日木曜日
  • 16. restify ? • RESTに特化したnode.jsモジュール • Expressを軽量化したようなもの 13年4月18日木曜日
  • 17. restifyの主な機能 • Routing • Header Parser / Error handler • JSONP/JSON support • GZIP support • URL-encoder • multipart form 13年4月18日木曜日
  • 18. restify導入 • $ npm install restify • var restify = require('restify'); 13年4月18日木曜日
  • 19. Routing var restify = require('restify'); var server = restify.createServer(); server.use(restify.queryParser()); function send(req, res, next) { res.send('hello ' + req.params.name); return next(); } server.post('/hello', function create(req, res, next) { res.send(201, Math.random().toString(36).substr(3, 8)); return next(); }); server.get('/hello/:name', send); server.head('/hello/:name', send); server.del('hello/:name', function rm(req, res, next) { res.send(204); return next(); }); 13年4月18日木曜日
  • 20. Mongoose ? • MongoDB用ドライバ • Object Modeling Tool (O/Rマッパ) • DBコネクションのバッファリング • Validator、Defaults、Index等の定義可 13年4月18日木曜日
  • 21. Mongooseの使用例 var UserSchema = new mongoose.Schema({ email:{ type: String, unique: true, index: true }, password:String, created_at:{type: Date, default: Date.now}, updated_at:{type: Date, default: Date.now} }); UserSchema.pre('save', function(next) { this.updated_at = Date.now(); next(); }); var User = mongoose.model('user', UserSchema); 13年4月18日木曜日
  • 22. Mongoose導入 • $ npm install mongoose • var mongoose = require('mongoose'); 13年4月18日木曜日
  • 23. cloud9 IDE • ブラウザベースIDE • クラウド上にプライベート領域を作れる (github,bitbucket,heroku等と連携) • Node.js、PHP、Java、Ruby等をサポート 13年4月18日木曜日
  • 24. cloud9 IDE 導入 • ローカル環境にインストールも可能 • $ git clone https://github.com/ajaxorg/ cloud9.git cloud9 • sudo ./cloud9/bin/cloud9.sh 13年4月18日木曜日
  • 25. cloud9 IDEの起動 • ./bin/cloud9.sh -w {workspace_dir} で起動 • http://localhost:3131 にアクセス 13年4月18日木曜日
  • 26. 認証方式 • SSL + Basic認証 + sha1(solt) 13年4月18日木曜日
  • 27. restify.authorizationParser • server.use(restify.authorizationParser()); • req.authorization オブジェクト { scheme: <Basic|Signature|...>, credentials: <Undecoded value of header>, basic: { username: $user password: $password } } 13年4月18日木曜日
  • 28. 認証基盤の実装 server.use(function authenticate(req, res, next) { if (!req.authorization.basic) { res.header('WWW-Authenticate', 'Basic realm=""'); res.send(401); return next(false); } User.findOne({email:req.username}, function (err, user) { if (err) { return next(err); } if (!user && user.password !== req.authorization.basic.password) { return next(new restify.NotAuthorizedError()); } return next(); }); }); 13年4月18日木曜日
  • 29. 実装上の注意 • I/O系関数は処理順序を保証しない var user = User.findOne({email:req.params.email}); user.password = req.params.password; user.save(); res.send(user); 13年4月18日木曜日
  • 30. 実装上の注意 • 必ずコールバックにて処理 User.findOne({email:req.params.email}, function(err, user) { user.password = req.params.password; user.save(function(arr, data)) { res.send(data); }); } 13年4月18日木曜日
  • 31. 実装上の注意 • 複雑な処理の同期が必要な場合は外部 モジュールを検討する ‣ async.js ‣ node-fibers ‣ flow-js ‣ step 13年4月18日木曜日
  • 32. 実装して思ったこと • 非同期処理が不要な場合node.jsは向かない  (client, middlewareにロジックを置く場合は有) • MongoDBと簡易JsonAPIは相性がいい • node.jsと関連モジュールはまだまだ過渡期 13年4月18日木曜日