Я новичок в Node (и, как правило, весь внутренний веб-дизайн), и я начал писать RESTful API в Node. Есть несколько вещей, которые я пытаюсь развернуть.
Мое приложение использует Express и Mongoose, и я использую модуль express-resource
, чтобы легко создавать маршруты CRUD для ресурсов API. Но есть несколько вещей, в которых я недоволен, и думаю, что я мог бы сделать лучше.
Первый - Мангуст. Если я хочу написать тесты для своего API, у меня нет способа укоротить Mongoose, чтобы заставить его записывать данные в память. Тем не менее, все учебные пособия, похоже, указывают на Mongoose, и я действительно не уверен, что я должен использовать.
Во-вторых, у моего ресурса, похоже, много шаблонов. Это действительно лучший способ создать RESTful API в Node.js? Существуют ли другие модули, которые помогут мне создать мои CRUD-маршруты? Я считаю, что есть способы создать CRUD-маршруты прямо из вашей схемы, без кода больше, но я действительно не уверен, как это сделать.
Я видел проекты там, такие как Tower.js и CompoundJS (формально RailwayJS), которые кажутся такими всеобъемлющими решениями, которые решают гораздо больше, чем мои проблемы здесь. Возможно, я должен использовать их, но я действительно хочу, чтобы приложение Node.js было API и ничего больше. Я имею дело с интерфейсом независимо от API.
Чтобы обеспечить некоторый контекст, вот моя текущая ситуация. В настоящее время у меня есть модель, определенная в 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')
Далее я определяю контроллеры для маршрутов 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()
})
}
Наконец, я использую модуль express-resource
для сопоставления этих контроллеров с необходимыми маршрутами CRUD поверх приложения Express.
app.resource('api/links', require('../resources/links'))