我是 Node 的初学者(通常是所有后端 Web 开发),并且我已经开始在 Node.js 中编写一个 RESTful API。我正在努力解决一些问题。
我的应用程序使用 Express 和 Mongoose,并且我正在使用该express-resource
模块轻松地为 API 资源创建我的 CRUD 路由。但是有几件事我不满意,我认为我可以做得更好。
第一个是猫鼬。如果我想为我的 API 编写测试,我无法通过存根 Mongoose 来强制它存储在内存数据中。然而,那里的所有教程似乎都指向猫鼬,我真的不确定我应该使用什么。
其次,我的资源似乎有很多样板代码。这真的是在 Node.js 中创建 RESTful API 的最佳方式吗?是否有其他模块可以帮助我创建我的 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
模块将这些控制器映射到 Express 应用程序顶部的必要 CRUD 路由。
app.resource('api/links', require('../resources/links'))