рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп Node.js рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, "рдЖрд░рд╛рдо" рдХреЗ рд▓рд┐рдП рдПрдирдкреАрдПрдо рдкрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднрд╛рд░реА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдореЗрдВ Node.js. рдкрд░ REST API рдмрдирд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ
рдПрдХреНрд╕рдкреНрд░реЗрд╕
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рджреЗрдирд╛ рд╕рдмрд╕реЗ рдЖрдо рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рд╢реБрд░реБрдЖрдд рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг
рдПрдХреНрд╕рдкреНрд░реЗрд╕ 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
Restify Node.js рдПрдкреАрдЖрдИ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкреБрд░рд╛рдирд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдерд┐рд░ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реИред рдпрд╣ рд╕рд╣реА REST рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ:
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
рд╣рдкреНрдкреА рд╡реЙрд▓рдорд╛рд░реНрдЯ рд▓реИрдмреНрд╕ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдХрдо-рдЬреНрдЮрд╛рдд рдврд╛рдВрдЪрд╛ рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рд░рд┐рд╕реНрдЯреЛрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдЬреЛ рдмреЙрдХреНрд╕ рдХреЗ рдареАрдХ рдмрд╛рд╣рд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
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();
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ | рд╡рд┐рдкрдХреНрд╖ |
---|---|
| рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рд░рд┐рд╕реНрдЯрд┐рдлрд╛рдИ рдХреА рддрд░рд╣ рд╣реИрдкреА, рд╢рд╛рдирджрд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
|
рдПрдХреНрд╕рдкреНрд░реЗрд╕, рд░рд┐рд╕реНрдЯреЛрд░, рдФрд░ рд╣рдкреНрдкреА рдорд╣рд╛рди рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЦрд░рд╛рдм рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реВрдкрдмреИрдХ
рд╕реНрдЯреНрд░реЙрдиреНрдЧреНрд▓реВрдк рд▓реВрдкрдмреИрдХ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреЗрдЯрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг- рд╕рдВрдЪрд╛рд▓рд┐рдд Node.js рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдпрд╣ " рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛ " рдордВрддреНрд░ рдХреЛ рдЕрдкрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
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);
рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рдЫрд╣ рд▓рд╛рдЗрдиреЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдпреЗ рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдПрдВрдЧреА:
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'}));
рдЕрдм рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЛ рдЦреЛрд▓реЗрдВ : 8080 / рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░
рд▓реВрдкрдмреИрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░рдкреАрд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
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 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдкрдмреИрдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред
- рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝реЗрдВ ред
- рдпрджрд┐ рдЖрдкрдХреЛ Node.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ StrongOps рдЖрдЬрд╝рдорд╛рдПрдВ ред