私はNode(および通常はすべてのバックエンドWeb開発)の初心者であり、NodeでRESTfulAPIの作成を開始しました。私が頭を動かそうとしていることがいくつかあります。
私のアプリケーションはExpressとMongooseを使用しており、express-resource
モジュールを使用してAPIリソースのCRUDルートを簡単に作成しています。しかし、私が不満に思っていることがいくつかあり、もっとうまくやれると思います。
最初はマングースです。APIのテストを作成したい場合、Mongooseをスタブしてメモリデータに強制する方法はありません。そこにあるすべてのチュートリアルはマングースを指しているようですが、私は本当に何を使うべきかわかりません。
第二に、私のリソースには多くの定型コードが含まれているようです。これは、Node.jsでRESTful APIを作成するための本当に最良の方法ですか?CRUDルートの作成に役立つ他のモジュールはありますか?コードを使わずに、スキーマから直接CRUDルートを作成する方法はあると思いますが、その方法はよくわかりません。
Tower.jsやCompoundJS(正式にはRailwayJS)など、ここでの私の問題よりもはるかに多くのことを解決する包括的なソリューションのように見えるプロジェクトを見てきました。おそらく私はそれらを使用する必要がありますが、実際にはNode.jsアプリケーションをAPIにするだけで、それ以上のものは必要ありません。APIとは独立してフロントエンドを扱っています。
いくつかのコンテキストを提供するために、これが私の現在の状況です。現在、私はマングースで定義されたモデルを持っています:
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
モジュールを使用して、これらのコントローラーをExpressアプリの上部にある必要なCRUDルートにマップします。
app.resource('api/links', require('../resources/links'))