
信じられないほど活発なNode.jsコミュニティのおかげで、NPMの「残り」の結果の数は圧倒的です。 それぞれに独自の実装とアプローチがありますが、一部にはNode.jsでREST APIを作成する際に共通点があります。
エクスプレス
最も一般的なアプローチは、Expressを使用してリソースへのアクセスを許可することです。 これにより簡単に開始できますが、その後はより難しくなります。
例
Express 4.xの最新バージョンのルーターを使用すると、リソースは次のようになります。
var express = require('express'); var Item = require('models').Item; var app = express(); var itemRoute = express.Router(); itemRoute.param('itemId', function(req, res, next, id) { Item.findById(req.params.itemId, function(err, item) { req.item = item; next(); }); }); itemRoute.route('/:itemId') .get(function(req, res, next) { res.json(req.item); }) .put(function(req, res, next) { req.item.set(req.body); req.item.save(function(err, item) { res.json(item); }); }) .post(function(req, res, next) { var item = new Item(req.body); item.save(function(err, item) { res.json(item); }); }) .delete(function(req, res, next) { req.item.remove(function(err) { res.json({}); }); }) ; app.use('/api/items', itemRoute); app.listen(8080);
長所 | 短所 |
---|---|
|
|
改めて
RestifyはNode.js API分野では比較的古いプレーヤーですが、非常に安定しており、積極的に開発されています。 適切なRESTサービスを構築するために作成され、意図的にExpressに似ています。
例
Expressに似ているため、構文はほぼ同じです。
var restify = require('restify'); var Item = require('models').Item; var app = restify.createServer() app.use(function(req, res, next) { if (req.params.itemId) { Item.findById(req.params.itemId, function(err, item) { req.item = item; next(); }); } else { next(); } }); app.get('/api/items/:itemId', function(req, res, next) { res.send(200, req.item); }); app.put('/api/items/:itemId', function(req, res, next) { req.item.set(req.body); req.item.save(function(err, item) { res.send(204, item); }); }); app.post('/api/items/:itemId', function(req, res, next) { var item = new Item(req.body); item.save(function(err, item) { res.send(201, item); }); }); app.delete('/api/items/:itemId', function(req, res, next) { req.item.remove(function(err) { res.send(204, {}); }); }); app.listen(8080);
長所 | 短所 |
---|---|
| 短所はエクスプレスと同じです-多くの余分な作業。
|
ハピ
hapiは、Walmart Labsチームが開発したあまり知られていないフレームワークです。 ExpressやRestifyとは異なり、わずかに異なるアプローチを採用しており、すぐに使用できる機能が増えています。
例
var Hapi = require('hapi'); var Item = require('models').Item; var server = Hapi.createServer('0.0.0.0', 8080); server.ext('onPreHandler', function(req, next) { if (req.params.itemId) { Item.findById(req.params.itemId, function(err, item) { req.item = item; next(); }); } else { next(); } }); server.route([ { path: '/api/items/{itemId}', method: 'GET', config: { handler: function(req, reply) { reply(req.item); } } }, { path: '/api/items', method: 'PUT', config: { handler: function(req, reply) { req.item.set(req.body); req.item.save(function(err, item) { res.send(204, item); }); } } }, { path: '/api/items', method: 'POST', config: { handler: function(req, reply) { var item = new Item(req.body); item.save(function(err, item) { res.send(201, item); }); } } }, { path: '/api/items/{itemId}', method: 'DELETE', config: { handler: function(req, reply) { req.item.remove(function(err) { res.send(204, {}); }); } } } ]); server.start();
長所 | 短所 |
---|---|
| ExpressやRestifyなどのhapiは優れた機能を提供しますが、それらの使用方法を理解する必要があります。
|
Express、Restify、およびhapiは優れたスタートアップソリューションですが、APIの開発を計画している場合は、悪い選択かもしれません。
ループバック
StrongLoop LoopBackは、REST APIを介してアプリケーションをデータに接続するための本格的なNode.jsフレームワークです。 Ruby on Railsで一般的になった「 配置の配置 」マントラを採用しています 。
例
var loopback = require('loopback'); var Item = require('./models').Item; var app = module.exports = loopback(); app.model(Item); app.use('/api', loopback.rest()); app.listen(8080);
多くの魔法が舞台裏で発生しますが、これらのリソースを作成するコードは6行だけです。
GET /items GET /items/count GET /items/findOne GET /items/{id} GET /items/{id}/exists POST /items PUT /items PUT /items/{id} DELETE /items/{id}

APIを簡単に学習するには、組み込みのエクスプローラーモジュールを接続するだけです。
var explorer = require('loopback-explorer'); app.use('/explorer', explorer(app, {basePath: '/api'}));
localhost :8080 / explorerを開いて、このクールなドキュメントを入手してください:

LoopBackの例は非常に単純ですが、RPCリソースについてはどうですか?
var loopback = require('loopback'); var explorer = require('loopback-explorer'); var remoting = require('strong-remoting'); var Item = require('./models').Item; var app = module.exports = loopback(); var rpc = remoting.create(); function echo(ping, callback) { callback(null, ping); } echo.shared = true; echo.accepts = {arg: 'ping'}; echo.returns = {arg: 'echo'}; rpc.exports.system = { echo: echo }; app.model(Item); app.use('/api', loopback.rest()); app.use('/explorer', explorer(app, {basePath: '/api'})); app.use('/rpc', rpc.handler('rest')); app.listen(8080);
これで次のことができます。
$ curl "http://localhost:8080/rpc/system/echo?ping=hello" { "echo": "hello" }

長所 | 短所 |
---|---|
| フレームワークは多くの詳細で構成されているため、エントリのしきい値は少し高くなっています。
|
次は何ですか
- npm経由でLoopBackをインストールします 。
- ドキュメントを読んでください 。
- Node.jsアプリケーションクラスタリングとパフォーマンスモニタリングが必要な場合は、 StrongOpsを試してください 。