如何在Node.js中最好地创build一个RESTful API

我是Node的初学者(通常是所有的后端Web开发),并且我已经开始在Node中编写一个RESTful API。 有几件事情我正试图让我的头脑。

我的应用程序使用Express和Mongoose,并使用express-resource模块轻松创build我的API资源的CRUD路由。 但是有一些我不高兴的事情,并认为我可以做得更好。

首先是mongoose。 如果我想为我的API编写testing,我没有办法将Mongoose强制存储到内存中。 所有的教程似乎指向mongoose,但是,我真的不知道我应该使用什么。

其次,我的资源似乎有很多样板代码。 这真的是在Node.js中创buildRESTful API的最好方法吗? 还有其他模块,可以帮助我创build我的CRUD路线吗? 我相信有一些方法可以直接从你的模式创buildCRUD路线,而不需要代码,但我真的不知道如何。

我已经看到了像Tower.js和CompoundJS(正式的RailwayJS)这样的项目,似乎这些解决scheme比我的问题解决得更多。 也许我应该使用它们,但我真的只想要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')) 

你应该看看restify

如果你想使用快递,你也可以看看我做的这个项目 – 叫做节点宁静 。

这个库似乎更成熟,但有更多的function: https : //github.com/jspears/mers

Strongloop Loopback看起来是生成Node / MongoDB API的另一个好的select。 它也可以生成摩卡testing 。

看看Hapi,它是一个以configuration为中心的框架,用于构buildWeb应用程序和API,并将其用作平稳的服务。

其他选项是sails.js和actionhero

Strapi是一个新的(2015)框架。

他们网站上的pipe理界面允许您创build一个API并指定模型之间的关系。 (从他们的介绍video中可以看出)

但是它被devise为在Koa服务器上运行,而不是在Express上运行。

我推荐Baucis + Express。 成千上万的用户,基于Mongoose的模型驱动devise,非常灵活,符合规范,HATEOAS / Level 3就绪。 完美地满足我的所有需求。 但是,我是作者:) https://github.com/wprl/baucis

这是当前框架的问题。

当你从谷歌search“最好”,“最快”的框架等等来的时候,人们会掉线说:“嘿,你应该尝试这个sails.js,羽毛,德比等…”

好的问题是: – 你只是为了获得这些框架的乐趣 – 如果是的话,你可以很容易地得到一个框架列表,然后开始对它们进行基准testing。

  • 我假设大部分人都是“我想build立一个产品,build一个网站可以赚钱,至less它会变成stream行”;

好的,你在这里search的关键字和注意力都是错误的,试着search“生产准备好”,“企业准备好”,“案例研究”这些关键字,或者也许去real.com和searchnode.js,进一步挖掘什么大多数公司使用的node.js框架,答案可能只是简单的说“express”。

如果是的话,从node.js堆栈中,框架几乎可以缩小其中的一些:Hapi,Strongloop,甚至不受欢迎的来自Yahoo的Mojito

对于那些框架,至less你可以说 – “他们真的是生产或企业准备好的” – 因为他们已经使用了来自雅虎的沃尔玛,来自其他大型巨头,有些甚至几年。

这可以解释为什么Ruby on Rails和Django仍然主宰整个堆栈框架市场? 即使你看到很多“酷”的框架不断涌入市场,meteor,Sails.js,Go的狂欢,Java的戏剧火花无论你可以命名 – 这并不意味着这些框架比两个更糟糕,只是意味着他们需要时间赢得市场。

目前许多框架的另一个问题是“Ror”的一种一体化的克隆, 从最终用户的angular度来看,他们只是需要一些东西来帮助他们完成任务,需要高效率的工作,需要一些工作从开始到结束,像Ruby on Rails,就像MacOS一样,像Windows一样,经过testing的任何东西在那个时候,已经被人们日常使用。

看一下这个: 在这里输入图像说明

借助Feathers,您可以在几分钟内构build原型,并在几天内即可生产现成的实时后端和REST API。 认真。

我一直使用Express在Node.js上构buildRESTful API,并且在Express 4中增加了Router,所以构build它更加容易。 这里详细介绍http://www.codekitchen.ca/guide-to-structuring-and-building-a-restful-api-using-express-4/

尝试https://hivepod.io/并在完整的MEAN堆栈中生成您的示例。; Hivepodbuild立在BaucisJS + ExpressJS + MongoDB + AngularJS之上。

免责声明:我正在构buildHivepod。

看看这个链接

这个项目使用与ASP.Net WebApi 2.0相同的项目架构来构build。 这意味着它将有控制器,authentication机制等开始。 所有你需要做的就是创build你自己的控制器。

我很惊讶没有人提到Nodal 。

从网站:

Nodal是Node.js的Web服务器,针对快速高效地构buildAPI服务进行了优化。

拥有自己的舆论,明确,习惯和高度可扩展的框架,诺达尔照顾你和你的团队的所有艰难的决定。 这使您可以专注于在短时间内创build有效的产品,同时最大限度地减less技术债务

它被积极地维护,在Github上有超过3800多个星星(在撰写本文时),内置了一个命令行工具来生成样板代码,整体上可以快速完成工作。