如何在Node.js中最好地创建RESTful API

时间:2013-02-20 21:45:17

标签: api node.js mongodb architecture express

我是Node(通常是所有后端Web开发)的初学者,我已经开始在Node中编写RESTful API。我正试图解决一些问题。

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

第一个是猫鼬。如果我想为我的API编写测试,我无法将Mongoose存根到内存数据中。然而,所有的教程似乎都指向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'))

14 个答案:

答案 0 :(得分:29)

您应该查看restify

如果您想使用快递,您还可以查看我制作的这个项目 - 名为node-restful

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

答案 1 :(得分:5)

Strongloop Loopback似乎是生成Node / MongoDB API的另一个好选择。它也可以生成mocha tests

答案 2 :(得分:4)

看看Hapi这是一个以配置为中心的框架,用于构建用作休息服务的Web应用程序和API。

其他选项包括sails.jsactionhero

答案 3 :(得分:4)

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

网站上的管理界面允许您创建API并指定模型之间的关系。 (从他们的介绍视频中可以看出。)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

检查一下: enter image description here

  

使用Feathers,您可以在几分钟内构建原型,并在几天内生成准备好的实时后端和REST API。严重。

答案 6 :(得分:2)

以下是有关框架的问题。

当你从谷歌搜索“最好的”,“最快的”框架等等,等等,人们会放弃一句话说“嘿,你应该试试这个sails.js,羽毛,德比等......”

好的问题是: - 您是否只是为了这些框架的乐趣 - 如果是的话,您可以轻松获得框架列表,然后开始对它们进行基准测试。

  • 我假设大多数人都是“我想建立一个产品,建立一个网站可以在未来赚钱,或者至少它会变得流行”;

好的,你在这里搜索关键词和关注点都是错误的,尝试搜索“生产准备就绪”,“企业就绪”,“案例研究”那些关键词,或者可以去Indeed.com和搜索node.js,进一步挖掘出大多数公司使用的node.js框架,答案可能只是简单地说“表达”。

如果是这样,从node.js堆栈,框架将几乎缩小其中几个:Hapi,Strongloop,甚至不受欢迎的雅虎莫吉托

对于那些框架,至少你可以说 - “他们真的是生产或企业准备好了” - 他们一直在使用沃尔玛,雅虎,其他大型巨头从一段时间,有些甚至几年。 / p>

这可以解释为什么Ruby on rails和Django仍然占据整个堆栈框架市场的主导地位?即使你看到许多“酷”框架继续上市,Meteor,Sails.js,Go's Revel,Java's Play Spark,无论你能说出什么 - 这并不意味着这些框架比两者差,只是意味着他们需要时间赢得市场。

目前很多框架的另一个问题是“Ror”的一体化克隆;从最终用户的角度来看,他们只需要帮助他们完成工作,需要高效工作,需要从头到尾工作的东西,比如Ruby on Rails,比如MacOS,就像windows一样,就像经过测试的任何东西一样到时候,人们每天都在使用。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

免责声明:我在建造Hivepod。

答案 9 :(得分:0)

查看此link

此项目使用相同的项目结构构建,后面是ASP.Net WebApi 2.0。这意味着它将具有控制器,认证机制等。您需要做的就是创建自己的控制器。

答案 10 :(得分:0)

我很惊讶没有人提到Nodal

来自网站:

  

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

     

拥有自己的见解,明确,惯用和高度可扩展的框架,Nodal负责为您和您的团队做出所有艰难的决定。这使您可以专注于在短时间内创建有效的产品,同时最大限度地减少技术债务

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

答案 11 :(得分:0)

这是在库系统中执行CRUD操作的示例

var schema=require('../dbSchema');
var bookmodel=schema.model('book');

exports.getBooks = function (req,res) {
    bookmodel.find().exec().then((data)=>{
        res.send(data)
    }).catch((err)=>{
        console.log(err);
    });
};

exports.getBook = function (req,res) {
var bkName=req.params.Author;
bookmodel.find({Name:bkName}).exec().then((data)=>{
    res.send(data)
}).catch((err)=>{
    console.log(err);
});
};

exports.getAutBooks = function (req,res) {
    bookmodel.find({},'Author').then((data)=>{
        res.send(data);
    }).catch((err)=>{
    console.log(err);
    });
};

exports.deleteBooks=function(req,res){
    var bkName=req.params.name;
    bookmodel.remove({Name:bkName}).exec().then((data)=>{
        res.status(200);
        console.log(bkName);
    }).catch((err)=>{
        console.log(err);
    });
    };

exports.addBooks=function(req,res){
    var newBook=new bookmodel({
        Name:req.body.Name,
       ISBN:req.body.ISBN,
       Author:req.body.Author,
       Price:req.body.Price,
       Year:req.body.Year,
       Publisher:req.body.Publisher
    });
    newBook.save().then(()=>{
        res.status(201);
    }).catch((err)=>{
        console.log(err);
    });
};

答案 12 :(得分:0)

for

答案 13 :(得分:0)

我是express的忠实拥护者,并且一直在使用它在Node.js上构建更易于构建的RESTful API。但是,当我们的应用程序开始增长时,我们遇到了这样的情况,即快速结构不能很好地扩展,并且有更多的代码分裂,这使我们难以维护。

我来自C#/ Java背景,其中大量使用SOLID原理。已证明Java Spring / C# WebAPI之类的框架可以创建企业级应用程序。 我想要一个可以重用现有C#/ Java技能(reuse I mean MVC architecture, OOPS, SOLID, DI, Mocks ... yeah, strong typing)的框架。不幸的是,我找不到满足我要求的框架(It should have less learning curve, minimalist codebase size, completely express compatible

“完全表达兼容”是什么意思?无论表达什么,即使我在{{3} }使用起来非常不错,但是它要处理大量文档,并且框架是耦合的,并不是我真正想要的。

所以我创建了Strongloop Loopback,由Typescript(has interfaces, classes, abstract classes and strong oops)驱动。该软件包现在非常稳定。

使用Dinoloop,您可以在可扩展的体系结构中构建企业级应用程序。 它使用依赖注入框架,但是您可以配置打字稿中可用的任何DI框架。 Dinoloop使Typescript可用作Nodejs REST框架,该框架帮助我为angularnode项目维护了通用的Typescript代码库。

因此,Dinoloop非常适合打字稿爱好者和有角度的开发人员。

相关问题