koa 有没有和express res.localss相似的功能

koa学习笔记三---手写thunkify模块_小组_ThinkSAAS
koa学习笔记三---手写thunkify模块
koa学习笔记三---手写thunkify模块
跟co模块高度相关的thunkify模块。
Turn a regular node function into one which returns a thunk, useful for generator-based flow control such as co.
从字面意思来理解,把一个普通的Node函数转换为返回值为thunk的函数。不用深究字面义,thunkify的目的在于把函数分解为两步来执行。第一步传递非回调之外的参数,第二步传递回调函数。
module.exports =
function thunkify(fn) {
return function() {
var args = Array.prototype.slice.call(arguments, 0);
return function() {
fn.apply(this, args.concat(arguments[0]));
代码很简单,没有错误处理,所有运行时错误会直接抛出。npm上的thunkify模块,看着有点乱糟糟的,可能是我考虑不周全所致。
测试代码如下:
var should = require('should');
var thunkify = require('../thunkify.js');
var path = require('path');
var fs = require('fs');
describe('thunkify', function () {
it('should resolve right', function (done) {
var thunk = thunkify(fs.readFile)(path.join(__dirname, '/fixture/fixture'));
thunk(function(err, value) {
if (err) return done(err);
value.toString().should.equal('love is color blind!');
知识点记录
函数内部所有参数可以通过arguments对象来访问。arguments对象与数组很相似,通过数字下标来访问对应的值,但是只具备length属性,不具备其他属性。转化为数组方法很简单:
Array.prototype.slice.call(arguments, 0);
PHP开发框架
缓存Memcache
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。Node.js实现RESTful api,express or koa? - 推酷
Node.js实现RESTful api,express or koa?
文章导读:
一、what's RESTful API
二、Express RESTful API
三、KOA RESTful API
四、express还是koa?
五、参考资料
一、what's RESTful API
1.1 RESTful架构
要理解什么是RESTful API我们可以先看一下什么是RESTful架构。
REST是Representational State Transfer的缩写,我们可以理解为它的含义是“表现层状态转化”,wikipedia是这样说的:“an architectural style that abstracts the architectural elements within a distributed hypermedia system”,这就是REST互联网软件的架构原则。
我们可以说如果一个架构符合REST原则,就称它为RESTful架构。
1.2 RESTful API
那么回到我们的RESTful api,我们为了有一种统一的机制,方便不同的前端设备与后端进行通信于是便有了 RESTful API这一套目前比较成熟的互联网应用程序的API设计理论。那么我们为了设计一个合理,好用的api,需要做些什么呢?简单的说大致需要做到以下几点:
1 1. api与用户的通信协议总是使用HTTPs
2 2. 我们尽量将API部署在专用域名下:https://
3 3. url中有标示api版本号的字段:https:///v1/
4 4. 路径带有明确的含义:https:///v1/animals
5 5. 明确资源的具体操作类型,使用相应的HTTP方法:GET/POST/PUT/DELETE/PATCH
6 6. api中提供过滤信息的参数:?page=2&per_page=100:指定第几页,以及每页的记录数
7 7. 请求api后服务器需要返回明确的状态码,如果出错,带有错误处理
其实我们可以简单的理解为RESTful API就是更加规范的API。
下面我们就可以开始基于Nodejs的express和koa来实现一些例子理解下RESTful API。
二、Express RESTful API
2.1简单的get数据库中的数据
我们先通过一个简单些的只get获取数据库中数据的例子开始:
2.1.1 准备工作:
确认我们已经安装了
2.1.2 先开始最简单的例子:
目录结构,data是数据库相关的目录,我们可以先忽略掉:
确保我们的package.json文件中有mongodb等依赖:
&name&:&node-api&,
&main&:&server.js&,
&dependencies&:{
&express&:&~4.0.0&,
&mongoose&:&~3.6.13&,
&body-parser&:&~1.0.1&,
&morgan&:&~1.5.3&,
&mongodb&:&~2.0.33&,
&monk&:&~1.0.1&
在server.js中定义简单的路由和进行数据库操作:
1 var express = require('express');
2 var app = express();
3 var bodyParser = require('body-parser');
4 var path = require('path');
5 //database
6 var mongo = require('mongodb');
7 var monk = require('monk');
8 var db = monk('localhost:27017/restdata');
10 //app.use()里面没有函数
11 app.use(bodyParser.urlencoded({ extended : true}));
12 app.use(bodyParser.json());
14 app.use(express.static(__dirname+'/public'));
16 var collectorder = db.get('orderlist');
17 var collectuser = db.get('userlist');
20 app.get('/orders',function(req,res){
collectorder.find({},{limit:20},function(err,orders){
res.json(orders);
25 app.get('/users',function(req,res){
collectuser.find({},{},function(err,users){
res.json(users);
31 app.get('/users/:name',function(req,res){
//var collection = db.get(req.params.name);
//console.log(req.params.name);
collectuser.find({name:req.params.name},{},function(err,docs){
res.json(docs);
39 //客户端通过请求adduser接口post数据进入数据库
40 // app.post('/adduser',function(req,res){
var db = req.
collectuser.insert(req.body,function(err,result){
(err == null) ? {msg:''}:{msg:err}
52 app.listen(3000);
数据库操作:
1 mongod --dbpath c:\node\nodetest2\data (项目中data目标路径)
新开一个控制台窗口运行:
2 use nodetest2(意义上的数据库名称)
3 db.userlist.insert({'username' : 'test1','email' : '','fullname' : 'Bob Smith','age' : 27,'location' : 'San Francisco','gender' : 'Male'})
4 我们可以查看[] 的api,查看数据库的操作方法
如果没有什么问题的话,两个控制台窗口应该是这样的:
运行实例:
1 node server.js
访问url就可以看到我们获取到了的数据:
2.2 使用express实现数据交互(get/post/delete)
实际上,我们刚才的例子并不算是一个完整的express的项目。我们只是用到了其中的几个API。我们通过express-generator生成的express项目的脚手架应该是这个样子的:
我们可以看到入口的app.js文件,以及控制路由的routes和控制显示的views文件夹,里面存放了jade模板的文件。很好地组织了项目的目录。
可以从express官方github开始,快速上手express:[
这里说的数据交互的例子,有个非常详细易懂的教程:[
然而也可以直接获取我仓库中的项目源代码:[
三、KOA RESTful API
3.1 简单get数据
同样,koa版本我们也从最简单的实例开始。
1.目录结构,同样,我们也先忽略跟数据库相关的data文件夹:
2.确保我们的package.json文件中依赖了koa koa-route mongoose 和monk等:
&name&: &koarestapi&,
&version&: &0.0.1&,
&description&: &&,
&main&: &app.js&,
&dependencies&: {
&co-body&: &~0.0.1&,
&co-monk&: &~0.0.1&,
&koa&: &~0.1.2&,
&koa-route&: &~1.0.2&,
&koa-router&: &~2.2.0&,
&kongo&: &~0.0.3&,
&mongoose&: &~3.8.3&,
&monk&: &~0.7.1&
&author&: &yixuan&
3.同样在app.js中定义koa版本的路由和简单的数据库操作:
1 var koa = require('koa');
2 var route = require('koa-route');
3 var app = module.exports = koa();
4 var monk = require('monk');
5 var wrap = require('co-monk');
6 var db = monk('localhost:27017/apitest');
7 var books = wrap(db.get('books'));
9 app.use(route.get('/book',list));
10 app.use(route.get('/book/:title',show));
12 function *list(){
var res = yield books.find({});
this.body =
17 function *show(){
title = decodeURI(title);
var res = yield books.find({title:title});
this.body =
23 if(!module.parent) app.listen(3000);
我们看到了generator的影子。4.在上面的express版本中我们使用了自己的数据库中的数据,那么在实际的开发过程中,可能我们会想要调试本地已有的json文件中定义的数据。于是我们同样先起来mongo:
1 mongod --dbpath ~/work/Node-KOA/koarestapi/data(我们项目目标路径)
然后把数据指向项目中的json文件:
mongoimport --db apitest --collection books --file data.json
注意这对json文件中的数据格式稍有要求:[
5.运行实例:
1 node --harmony app.js
然后就可以看到我们定义在data.json中的数据了 :
3.2 更进一步的koa版本的restapi
同样的,上面只是个简单的例子。使用koa generator-k生成的项目脚手架应该是这样的:
我们在入口文件app.js中定义基本的依赖和访问入口处理,在controller文件夹中的index.js中定义路由操作,在view中定义页面显示相关。
非常典型的MVC目录结构。
更加完整的koa版本的REST项目可以在这里看到:[
四、express还是koa?
我们实际动手写过express的项目和koa的项目的话,就会有所体会,相比于koa,express做的事情要多一些,因此他的体积也相对比较大。
在上面两个例子中我们可以看到,在express版本的例子中我们使用它内置的路由就解决了问题,但是在KOA中我们需要额外的路由中间件,其实更准确的说,koa 内核中没有捆绑任何中间件,连常用的 post body 解析都没有...但这正体现出了koa的优势,koa的体积非常小,表现力更强,它使得中间件的编写变得更加容易。其实可以说,Koa基本上就是一个只有骨架的框架,它具有极强的拓展性,我们可以自己书写可充用和更加符合实际业务场景的中间件,而不用妥协的使用Express自带的中间件。Koa虽然小,但是它通过生成器(generators JavaScript 1.7新引入的,用于解决回调嵌套的方案)减少了异步回调,提高代码的可读性和可维护性,同时改进了错误处理(Express的错误处理方式相当糟糕)。
同时,Koa是一个采用面向未来的ES6的框架,比如说随处可见的generator函数。
虽然Koa还不是那么的稳定,但是毫无疑问的它是面向未来的,下一代Nodejs框架。
那么Koa相比于Express到底优势体现在那些方面呢?总的来说,koa 的先天优势在于 generator,带来的主要好处如下:
1 更加优雅、简单、安全的中间件机制
2 更加简单、优雅地异常处理
3 更加优雅地异步编程方式
这里有更加官方的说明:[
其实,koa 与 express 是共享底层库的,如果你会使用 express ,那么只要理解 generator 与 koa 框架 api,就可以快速上手。
如果还没有使用过express那么不如直接开始学习Koa,从这里开始:[
五、参考资料
&ps-接下来文章预告:
yield语句与Generator函数
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示最流行的Node.js精简型和全栈型开发框架介绍
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了最流行的Node.js精简型和全栈型开发框架介绍,本文讲解了Express.js、KOA、Total.js、Sails.js、Meteor、Mean.IO等框架,需要的朋友可以参考下
快速开发而又容易扩展,高性能且鲁棒性强。Node.js的出现让所有网络应用开发者的这些梦想成为现实。但是,有如其他新的开发语言技术一样,从头开始使用Node.js的最基本功能来编写代码构建应用是一个非常划不来的耗时的事情。这个问题的解决方案非常简单且已经经受起时间的考验:使用一个已经提前打造好的开发框架。因此才会有如此多的如Express.js,Koa,Sails.js等框架的概念提出来并加以实现。
这些开发框架的角色非常简单。就是要去为应用开发人员节省时间,让我们不用话费太多精力在一些不必要的事情上面。一旦一个框架可以满足开发人员的“用最小的代价来获得同样的产出”的理念的话,该框架就可以大行其道起来。
在当今的Node.js界中还没有一个框架可以一统江湖,虽然Express.js依然是迄今为止最流行的框架。但当今江湖上还有很多其他的门派在争夺武林盟主之位。不能说你丐帮成员众多别人就非要加入你丐帮的,大家都是为了学个防身之术(快速开发等Node.js框架),你丐帮有降龙十八掌(Express.js),人家武当还有太极(Sails.js等)啦。
总体来说你可以将Node.js开发框架归结为两类:
- 精简型框架
- 全栈型框架
下面我们就对这两种框架进行探讨。
精简型框架
精简型框架提供的是最基本的功能和APIs,这类框架本身就是被设计成用来改善Node.js开发过程中的主要方面的。但是,这些框架主要关注的方向都是提供基本的MVC开发框架功能和改善编码体验,而不是Node.js本身没有的其他功能和技术的支持。下面是一些当今流行的精简型的Node.js框架。
Express.js- 最流行的框架
Express.js毫无疑问是当今最受网络应用开发人员喜爱的Node.js开发框架了。作为一个有弹性的,轻量级的,容易使用框架,Express.js完全可以用来开发纯JS或混合型的便于扩展的移动应用。如果网上一些数据不是空穴来风的话,当今世上已经有26000个网络和移动应用是使用该框架进行开发的。其中一些有名的使用者粉丝包括 MySpace, Countly, Yummly, Mozilla Persona, 以及Geekli.st。所以,如果你是一个Node开发新手的话,也许Express.js就是你应该乘坐的快速列车。
KOA - Node.js下一代开发框架
作为一个由Express.js框架幕后开发团队进行开发和维护的另外一个Node.js开发框架,KOA是一个被热捧并冠名为Node.js的下一代开发框架的网络开发框架。因为该框架是由Express.js进化而成,所以你可以看到他们的很多相似之处,当然,区别肯定是有的了。它提供了一些额外的新功能,而该框架的中间件会把这些新功能和其他已有功能给隔离开来。另外,该框架还提供了高效开发和便于使用等功能特性来简化启动服务器和服务器相关功能的流程。
Total.js - 一个摩登的网络应用开发Node.js框架
尽管Total.js可以被认为是一个极简型的框架,但是它依然是可以作为Node.js框架的一个补充。该框架的目标用户是那些想要打造具有非常强大的可扩展性的应用的开发者。如果你现在想要打造的是一个网络应用,而该应用也许今后会进行大量的扩展的话,Total.js也许是一个完美的选择。
作为一个像Ruby On Rails一样的提供MVC开发模式模拟功能的框架,Sails.js其实是一个鲁棒的可扩展的Node.js开发框架。它自身是一个服务驱动(service-driven)的架构,而它的API集又是以数据驱动的方式进行提供的。它最大的用处应该就是用来打造多用户游戏,网络聊天,实时交互应用,以及企业泣别的Node.js应用。
全栈型Node.js开发框架
全栈型开发框架才是NodeJS所以发光发热的地方。大部分全栈型框架都包含了必须的应用开发基础库,完整的模版引擎,网络sockets,以及持久化的库来加速对实时可扩展的网络和移动应用进行构建。以下是当今最盛行的全栈型Node.js框架:
Meteor - 极其简单的应用开发环境
作为一个设计成集成了所有MEAN开发框架功能的框架,Meteor是一个JavaScrtip框架的集大成者,JavaScritp既可以运行在客户端浏览器中,同时也可以在服务器端的一个Node.js容器的Meteeor服务器中运行。另外,它还支持HTML代码,CSS,以及其他有用的静态工具。
所有这些功能在Meteor框架中都是非常有弹性的组织起来的,你可以很方便的用如文件目录树请求的方式进行使用。客户端和服务端各个组件的打包和数据传送都是由Meteor框架自动完成的。
Mean.IO- 完整的MEAN栈JavaScript开发框架
MEAN.IO是一个完全的JavaScript开发框架,它是专门设计成来简化以及加速开发基于MEAN栈的网络应用的。该框架自带了可以让你把MEAN框架的四个技术进行无缝接合的工具,比如,MongoDB, Express.js, AngularJS, 以及Node.js,甚至其他开创性的如Bootstrap等技术。同时它还拥有了很多HTML和CSS以及其他额外的JavaScript代码来大大的降低你的编码时间。但是,该框架最亮眼的其实是它强悍的MVC架构。你可以使用它来创建好模块化的代码,然后用其作为工具来打造出精致的网络或移动应用。MEAN.IO包是即插即用的,所以一旦有新功能包发布,你就可以像使用npm包一样来获得并使用它们。
MeanIO包系统把所有包都集成到mean项目里面,就好像这些代码本身就是mean自身的一部分一样。同时它也给开发者提供了所有必须的工具来把我们的包集成到我们的项目中。
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 express4 res.locals 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信