我是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'))
答案 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.js和actionhero
答案 3 :(得分:4)
答案 4 :(得分:2)
我推荐Baucis + Express。成千上万的用户,基于Mongoose的模型驱动设计,非常灵活,符合规范,HATEOAS / Level 3准备就绪。完美地满足我的所有需求。但是,我是作者:) https://github.com/wprl/baucis
答案 5 :(得分:2)
答案 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框架,该框架帮助我为angular
和node
项目维护了通用的Typescript代码库。
因此,Dinoloop非常适合打字稿爱好者和有角度的开发人员。