2013-02-20 9 views
43

Jestem początkującym użytkownikiem w Node (i ogólnie wszystkim programowaniu stron zaplecza) i zacząłem pisać RESTful API w węźle. Jest kilka rzeczy, które staram się zrozumieć.Jak najlepiej utworzyć RESTful API w Node.js

Moja aplikacja używa Express i Mongoose, i używam modułu express-resource do łatwego tworzenia moich tras CRUD dla zasobów API. Ale jest kilka rzeczy, z których jestem niezadowolony i myślę, że mógłbym lepiej.

Pierwsza to mangusta. Jeśli chcę napisać testy dla mojego API, nie mam możliwości zablokowania Mongoose, aby wymusić na nim dane z pamięci. Jednak wszystkie tutoriale wydają się wskazywać na Mongoose, ale nie jestem pewien, z czego powinienem skorzystać.

Po drugie, mój zasób wydaje się mieć dużo kodu na płycie głównej. Czy to naprawdę najlepszy sposób na stworzenie RESTful API w Node.js? Czy istnieją inne moduły, które pomogą mi utworzyć moje trasy CRUD? Wierzę, że istnieją sposoby, dzięki którym możesz tworzyć trasy CRUD prosto ze swojego schematu, bez żadnego kodu, ale nie jestem pewien jak.

Widziałem projekty takie jak Tower.js i CompoundJS (formalnie RailwayJS), które wydają się być tymi kompleksowymi rozwiązaniami, które rozwiązują znacznie więcej niż moje problemy tutaj. Być może powinienem ich używać, ale naprawdę chcę tylko, aby aplikacja Node.js była API i nic więcej. Zajmuję się front-endem niezależnie od API.

Aby podać pewien kontekst, oto moja obecna sytuacja. Obecnie mam model określony w Mongoose:

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 
    , Link 

var LinkSchema = new Schema({ 
    uri: String, 
    meta: { 
    title: String, 
    desc: String 
    }, 
    shares: [{ 
    uid: Schema.Types.ObjectId, 
    date: Date, 
    message: String 
    }] 
}) 

Link = module.exports = mongoose.model('Link') 

Następnie zdefiniować kontrolery dla tras CRUD:

var mongoose = require('mongoose') 
    , _ = require('underscore') 
    , Link = mongoose.model('Link') 

exports.load = function (req, id, fn) { 
    Link.findById(req.params.link, function (err, link) { 
    if (err) { 
     return res.send(err) 
    } 

    fn(null, link) 
    }) 
} 

exports.index = function (req, res) { 
    var filterByUser = req.query.user ? { 'shares.uid': req.query.user } : {} 

    Link.find(filterByUser, function (err, links) { 
    if (err) { 
     return res.send(err) 
    } 

    res.send(links) 
    }) 
} 

exports.create = function (req, res) { 
    var link = new Link(req.body) 

    link.save(function (err) { 
    if (err) { 
     // TODO: send 404 
     return res.send(err) 
    } 

    res.send(link) 
    }) 
} 

exports.show = function (req, res) { 
    res.send(req.link) 
} 

exports.update = function (req, res) { 
    req.link = _(req.link).extend(req.body) 

    req.link.save(function (err, link) { 
    if (err) { 
     return res.send(err) 
    } 

    res.send(link) 
    }) 
} 

exports.patch = exports.update 

exports.destroy = function (req, res) { 
    req.link.remove(function (err) { 
    if (err) { 
     return res.send(err) 
    } 

    res.send() 
    }) 
} 

Wreszcie użyć modułu express-resource mapować te kontrolery do niezbędnego CRUD trasy na aplikacji Express.

app.resource('api/links', require('../resources/links')) 

Odpowiedz

29

Należy zajrzeć do restify

Jeśli chcesz użyć Express, można również sprawdzić ten projekt, który zrobiłem - nazywa node-restful.

Biblioteka ta wydaje się być znacznie bardziej dojrzałe i mają więcej funkcji chociaż: https://github.com/jspears/mers

+0

Dzięki za udostępnienie węzłowi rest i mers. Oba wyglądają dobrze. Dlaczego mówisz, że powinienem użyć restify? Wygląda na to, że działa tak samo jak Express, jeśli nie mniej ... Nie jestem pewien, jak to pomaga. Byłoby dobrze, gdybyś mógł to wyjaśnić! –

+0

Słyszałem dobre rzeczy o restytucji, ale po obejrzeniu tego wygląda na to, że faktycznie nie generuje on dla ciebie operacji CRUD. Wygląda na to, że mers byłby prawdopodobnie najlepszą opcją. – Benoir

+0

Dzięki. Na razie pozostawiam to pytanie otwarte, aby sprawdzić, czy otrzymam jakieś inne sugestie. –

5

Strongloop Loopback seeems być inny dobrą alternatywą dla generowania node/MongoDB API. Może również generować mocha tests.

+0

+! Loopback ma interfejs sieciowy na localhost, aby pomóc zaprojektować modele i sprawdzić wygenerowane trasy. Jest to agnostyka bazy danych, dzięki czemu można za nią korzystać z MongoDB lub MySQL. Umożliwia także określenie [reguł ACL] (https://docs.strongloop.com/display/public/LB/Controlling+data+access), aby użytkownicy mieli dostęp tylko do danych, do których mają uprawnienia. – joeytwiddle

2

Polecam Baucis + Express. Tysiące użytkowników, oparte na modelach oparte na Mongoose, bardzo elastyczne, zgodne ze specyfikacjami, gotowe dla HATEOAS/Level 3. Idealnie pasuje do wszystkich moich potrzeb. Ale jestem, ja jestem autorem :) https://github.com/wprl/baucis

4

Spójrz na Hapi jego strukturę zorientowaną na konfigurację do budowania aplikacji internetowych i interfejsów API, które są używane jako usługa spokojna.

Inne opcje są sails.js i actionhero

+1

Dobrze. Na. To otworzyło dla mnie całkiem nowy świat, faceta z przodu. Dzięki Travis! – Cody

0

Wypróbuj https://hivepod.io/ i wygeneruj swój przykład w pełnym stosie MEAN. Hivepod buduje na bazie BaucisJS + ExpressJS + MongoDB + AngularJS.

Nota prawna: Pracuję przy budowie Hivepoda.

3

Strapi to nowe (2015) ramy.

Interfejs administratora na ich stronie internetowej umożliwia utworzenie interfejsu API i określenie relacji między modelami. (Jak można zobaczyć w ich wstępnym wideo).

Jednak jest przeznaczony do pracy na serwerze Koa, a nie Express.

0

Wystarczy popatrzeć na ten link

tego projektu jest zbudowanie za pomocą tego samego archutecture projektu, który jest następnie przez ASP.NET WebAPI 2.0. Oznacza to, że na początku będą mieć kontrolery, mechanizm uwierzytelniania itp. Wszystko, co musisz zrobić, to stworzyć własnych kontrolerów.

0

Jestem zaskoczony, że nikt nie wspomniał o Nodal.

ze strony:

Nodal jest serwer WWW dla node.js, zoptymalizowany do szybkiego i efektywnego budowania usług API.

Ciesząc się własnymi opiniami, wyraźnymi, idiomatycznymi i wysoce rozszerzalnymi ramami, Nodal dba o wszystkie trudne decyzje dla ciebie i twojego zespołu. To pozwala skupić się na tworzeniu skutecznego produktu w krótkim przedziale czasu a jednocześnie minimalizując długu technicznego

Jest aktywnie utrzymane, 3800+ gwiazdy na Github (w momencie pisania), posiada wbudowanego narzędzia wiersza polecenia w celu wygenerowania kodu standardowego, a ogólnie wykonuje pracę szybko.

1

to sprawdzić: enter image description here

piórami można zbudować prototypy w kilka minut i gotowe backendów produkcyjnych w czasie rzeczywistym i odpoczynek API w dniach. Poważnie.

2

Oto kwestie dotyczące dzisiejszych frameworków.

Kiedy przyjeżdżają tutaj z google szukając „najlepszy”, „najszybszy” ramy bla, bla, ludzie spadnie linię mówi: „Hej, należy spróbować tego sails.js, pióra, Derby etc ...”

Ok Pytanie brzmi: - Czy po prostu czerpiesz przyjemność z tych frameworków - jeśli tak, możesz łatwo uzyskać listę frameworków, a następnie zacząć je porównywać.

  • jestem zakładając większość ludzi są „Chcę zbudować produkt, zbudować witrynę można zarabiać w przyszłości, lub przynajmniej będzie się popularny”;

Ok, wszystko, czego szukać słów kluczowych i grzeczności tu jest nie tak, spróbuj poszukać „produkcję gotowy”, „gotowy przedsiębiorstwo”, „studium przypadku” te słowa kluczowe, a następnie, czy może iść do rzeczywiście.com i search node.js, dalej wykopuj to, z czego większość firm korzysta w strukturze node.js, odpowiedz może po prostu powiedzieć "express".

jeśli tak, Od node.js stosie, Ramy będzie dość dużo być zawężony kilka z nich: Hapi, Strongloop lub nawet popularny Mojito z Yahoo

szkieletowe Those przynajmniej można powiedzieć - "Są w rzeczywistości gotowe do produkcji lub dla przedsiębiorstw" - ponieważ używają oni od pewnego czasu Walmart, od Yahoo, od innych dużych gigantów od jakiegoś czasu, niektórzy nawet od kilku lat.

Czy to wyjaśnia, dlaczego Ruby na szynach i Django wciąż dominują na rynku ramowym z pełnym stosunkiem? nawet widzisz wiele "fajnych" frameworków utrzymujących się na rynku, Meteor, Sails.js, Go's Revel, Java Spark, cokolwiek możesz nazwać - To nie znaczy, że te ramy są gorsze od tych dwóch, tylko że potrzebują czasu aby wygrać na rynku.

Kolejne problemy, które występują w wielu obecnych ramach, to rodzaj "jednego w jednym", klona "Ror"; Z perspektywy użytkownika końcowego, Potrzebują czegoś, co pomoże im w załatwianiu spraw, będzie produktywne, potrzebuje czegoś do pracy od początku do końca, jak na przykład Ruby on Rails, np. MacOS, np. Windows, jak wszystko, co zostało przetestowane do tego czasu były codziennie używane przez ludzi.