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'))
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ć! –
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
Dzięki. Na razie pozostawiam to pytanie otwarte, aby sprawdzić, czy otrzymam jakieś inne sugestie. –