node.js + restify + mongoDBでお手軽 JSON Web API 作成
npm registry を探っていたら「restify」という便利そうなフレームワークを見つけたので使っててみました。
restifyは、REST Webサービスの構築に特化したフレームワークです。
Expressからテンプレート機能とかを省いて、便利な機能を付け足した感じです。
restifyのインストール
1 |
$ npm install restify |
とりあえず、公式サイトにあるサンプルコードを動かしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var restify = require('restify'); function respond(req, res, next) { res.send('hello ' + req.params.name); } var server = restify.createServer(); server.get('/hello/:name', respond); server.head('/hello/:name', respond); server.listen(8080, function() { console.log('%s listening at %s', server.name, server.url); }); |
実行
1 |
$ node sample.js |
http://<ホスト名>:8080/hello/<任意の名前>
ブラウザで上記のURLにアクセスすると
hello <任意の名前>
とレスポンスが帰ってきます。
URLのルーティング処理が簡潔にかけて便利ですね。
■ ゲストブックの作成
「restify」をググっていたら、restifyを使ってゲストブックを作成するチュートリアルを見つけたので、それを参考に簡単なゲストブックを作ってみます。
参考
Simple example – Node.js, Restify, MongoDb and Mongoose
データベースにはMongoDBを使うのでインストール。
インストール方法は以下を。
MongoDBのインストール
node.jsからmongodbへアクセスするためのモジュールをインストール。
1 2 |
$ npm install mongodb $ npm install mongoose |
・ゲストブックに使うWeb APIサーバーを記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
var restify = require('restify'); var server = restify.createServer(); server.use(restify.bodyParser()); var mongoose = require('mongoose'); var db = mongoose.connect('mongodb://localhost/webapi'); var Schema = mongoose.Schema; var messageSchema = new Schema({ name: String, comment:String, date: Date }); mongoose.model('message', messageSchema); var Message = mongoose.model('message'); function getMessage(req, res, next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); Message.find().sort('date',-1).execFind(function(arr, data){ res.send(data); }); } function postMessage(req, res, next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); var message = new Message(); message.name = req.params.name; message.comment = req.params.comment; message.date = new Date(); message.save(function(arr, data){ res.send(data); }); } server.get('/message', getMessage); server.post('/message', postMessage); server.listen(8080, function() { console.log('%s listening at %s', server.name, server.url); }); |
8080:/message にPOSTリクエストでname,commentを送信するとmongoDBに保存します。
8080:/message にGETリクエストを送信すると、保存されているすべてのデータをJSONで返します。
とりあえずテストしてみます。
・サーバー起動
1 |
$ node webapi.js |
・書き込みテスト
POSTリクエストを送信して、メッセージを書き込みます。成功すると書き込んだ内容がjsonで帰ってきます。失敗するとエラーメッセージがjsonで帰ってきます。
1 |
curl -d "name=test&comment=Hello World!" http://<ホスト名>:8080/message/ |
・読み込みテスト
GETリクエストを送信して、書き込んだ内容がちゃんと帰ってくるか確認します。
1 |
curl -is http://localhost:8080/message/ |
・mongoシェルで確認
ちゃんと書き込まれているか、一応mondo側でも確認。
1 2 3 4 5 6 7 8 9 10 11 |
$ monogo > show dbs local (empty) test 0.203125GB webapi 0.203125GB > use webapi switched to db webapi > show collections messages >db.messages.find() { "date" : ISODate("2012-07-21T03:49:31.807Z"), "comment" : "hello World!", "name" : "test", "_id" : ObjectId("500a26cbfd23dcb93c000029") } |
ひとまず、これでゲストブック用のWeb APIができました。
・ゲストブックページを作成
jQueryとjQuery.Modelプラグインを使って作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Gest Book</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script type="text/javascript" src="http://v3.javascriptmvc.com/jquery/dist/jquery.model.min.js"></script> <script> window.onload = function(){ $.Model('Message',{ findAll: 'GET http://<ホスト名>:8080/message/', create: 'POST http://<ホスト名>:8080/message/', },{}); var write = function(msg){ return $('<p>').model(msg) .html("<b>"+msg.name+"</b> "+msg.comment) .prependTo('#message_list'); } Message.findAll([],function(msgs){ $.each(msgs, function(i,msg){ write(msg); }); }) Message.bind('created', function( ev, msg) { write(msg); }) $("#send").click(function(){ var message = new Message({ name: $("#name").val(), comment:$("#comment").val() }); message.save(); }); } </script> </head> <body> nama: <input type="text" id="name"></input> comment: <input type="text" id="comment"></input> <input type="button" id="send" value="送信"></input> <hr> <div id="message_list"></div> </body> </html> |