HTTP构建一个网站:

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
if('GET' === req.method && '/img' === req.url.substr(0,4) && '.jpg' === req.url.substr(-4)) {
fs.stat(__dirname + req.url, function(err, stat) { //检查文件是否存在
if(err || !stat.isFile()) {
res.writeHead(404);
res.end('Not Found');
return;
}
serve(__dirname + req.url, 'image/png'); //'application/jpg':会下载图片
});
} else if('GET' === req.method && '/' === req.url) {
serve(__dirname + '/index.html','text/html');
} else {
res.writeHead(400);
res.end('Not Found');
}
function serve(path, type) {
res.writeHead(200, {'Content-Type': type});
fs.createReadStream(path).pipe(res); //将文件系统流接到HTTP响应流中;
} });
server.listen(3000);

通过connect实现一个网站:

  • 创建package.json:

    {
    "name": "my-website",
    "version": "0.0.1",
    "dependencies": {
    "connect": "1.8.7"
    },
    "description": "an connect website"
    }
  • 安装依赖:npm install;
  • 代码例子:
    //用connect修改http构建的网站;
    var connect = require('connect');
    var server = connect.createServer(); //可以简化 server = connect();
    server.use(function(req, res, next) {
    console.log(' %s: %s ', req.method, req.url);
    next(); //下一个中间件;
    });
    server.use(function(req, res, next) {
    if('GET' === req.method && '/img' === req.url.substr(0,4)) {
    console.log('img');
    } else {
    next();
    }
    });
    server.use(function(req, res, next) {
    if('GET' === req.method && '/' === req.url) {
    console.log('index');
    } else {
    console.log('other');
    next();
    }
    });
    server.use(function(req, res, next) {
    res.writeHead(404);
    res.end('Not Found');
    }); server.listen(3000);

中间件://中间件由函数组成,它除了处理req,res对象外还接受 一个next函数做流控制;

//sample.js
/*
请求超时
*/
module.exports = function(opts) {
var time = opts.time || 100;
return function(req, res, next) {
console.log(1);
var timer = setTimeout(function() {
console.log('\033[90m%s %s\033[91mis taking too long!\033[39m', req.method, req.url);
}, time);
var end = res.end;
res.end = function(chunk, encoding) {
res.end = end;
res.end(chunk, encoding);
clearTimeout();
}
next();
}
} //main.js
var connect = require('connect');
var time = require('./3.2');
var server = connect.createServer();
/*
记录请求情况
*/
server.use(connect.logger('dev'));
/*
实现时间中间件
*/
server.use(time({time: 500}));
/*
快速响应
*/
server.use(function(req, res, next) {
if('/a' === req.url) {
res.writeHead(200);
res.end('Fast!');
} else {
next();
}
});
/*
慢速响应
*/
server.use(function(req, res, next) {
if('/b' === req.url) {
setTimeout(function() {
res.writeHead(200);
res.end('slow');
}, 1000);
} else {
next();
}
}); server.listen(3000);
  • static中间件:

    • 挂载:将任意一个URL匹配到文件系统中任意一个目录

      server.use('/my-images', connect.static(__dirname + '/website/img'));
    • maxAge:设置一个资源客户端缓存的时间
      server.use('/js', connect.static(__dirname, {maxAge:10000}));
    • hidden:设置为true的话,connect也会托管文件系统中的隐藏文件
      server.use(connect.static(__dirname, {hidden:true}));
  • query中间件:获取查询字符串  //query中间件在express中默认是启用的;
    server.use(connect.query())
    server.use(function (req, res) {
    console.log(req.query.name); //req.query对象格式返回,如访问xxx?name = jinks;返回{name:'jinks'}
    })
  • logger中间件:诊断工具;将发送进来的请求信息和发送出去的响应信息打印在终端
    • server.use(connect.logger('dev'));

    • server.use(connect.logger('default'));

    • server.use(connect.logger('short'));

    • server.use(connect.logger('tiny'));

    • server.use(connect.logger(':method :remote-addr'  :res[Content-Length]));  //自定义格式输出; 查看完整的token
  • bodyParser中间层:
    • 与http模块中使用qs模块解析post请求消息体一样,bodyParser中间层也具有这样功能;

      server.use(connect.bodyParser());
      server.use(function(req, res, next) {
      //req.body;
      }
    • 其另一个功能就是处理用户上传的文件;
      var connect = require('connect');
      var fs = require('fs');
      var server = connect(connect.logger('dev'),connect.static('static'),connect.bodyParser()); //简化加载中间件
      //设置默认url:'/'为文件系统中static文件夹,如果有Index.html,就加载此项;
      server.use(function(req, res, next) {
      if('POST' === req.method ) {
      fs.readFile(req.files.files.path, 'utf8', function(err, data) {
      if(err) {
      res.writeHead(500);
      res.end('Error!');
      return;
      }
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.end([
      '<h3>File: ' + req.files.files.name + '</h3>',
      '<h4>Type: ' + req.files.files.type + '</h4>',
      '<h1>Contents:</h4><pre>' + data + '</pre>'
      ].join(''));
      });
      } else {
      next();
      }
      }) server.listen(3000);
  • cookieParser中间件; //读写cookie数据
    server.use(connect.cookieParser());
    
    server.use(function(req, res ,next) {
    //req.cookies //对象形式返回
    });
  • session中间件;

    • 出于安全考虑,在初始化session中间件的时候需要提供secret选项

      connect.session({secret: 'my app secret'})
    • 使用req.sesstion记录数据:    req.session.logged_in; req.session.name

创建会话:

--------------users.json----------------------------------
//当只要对外暴露数据时,不需要module.exports而直接把数据文件以JSON形式暴露出来
{
"jinks": {
"password" : "ferret",
"name": "jinks"
}
} --------------app.js------------------------------------
var connect = require('connect');
var users = require('./users'); var server = connect(
connect.logger('dev'),
connect.bodyParser(),
connect.cookieParser(),
connect.session({secret: 'my app secret'}),
function(req, res, next) {
console.log(req.session.logged_in);
if('/' === req.url && req.session.logged_in) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('welcome back, <b>' + req.session.name + '</b>. '
+ '<a href="/logout">Logout</a>');
} else {
next();
}
},
function(req, res, next) {
if('/' === req.url && 'GET' === req.method) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end([
'<form action="/login" method="post"'
+'<fieldset>'
+'<legend>Please log in</legend>'
+'<p>User: <input type="text" name="user"/></p>'
+'<p>Password: <input type="password" name="password"/></p>'
+'<button>Submit</button>'
+'</fieldset>'
+'</form>'].join(''));
} else {
next();
}
},
function(req, res, next) {
if('/login' === req.url && 'POST' === req.method) {
res.writeHead(200);
if(!users[req.body.user] || req.body.password != users[req.body.user].password) {
res.end('Bad username/password');
} else {
req.session.logged_in = true;
req.session.name = users[req.body.user].name;
res.end('Authenticated!');
}
} else {
next();
}
},
function(req, res, next) {
if('/logout' === req.url) {
req.session.logged_in = false;
res.writeHead(200);
res.end('Logged out!');
} else {
next();
}
}); server.listen(3000);

  

node工具--connect的更多相关文章

  1. node工具--express

    //使用supervisor  Connect是基于HTTP米快创建的:Express则是基于Connect上创建的: 绝大多数web服务器和浏览器之间的任务是通过url和method完成的,两者的组 ...

  2. node工具是是什么东西

    Node到底是个啥? Node是一个服务器端JavaScript解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅 最近写 ...

  3. node工具之nodemon

    nodemon nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序. 安装 npm install -g nodemon //或 npm ...

  4. node工具之node-ip

    node-ip node.js用来获取id地址的工具 use var ip = require('ip'); ip.address() // my ip address ip.isEqual('::1 ...

  5. node工具之pm2

    pm2 PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器.它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务. 安装 npm install p ...

  6. node工具之http-proxy-middleware

    简介 一个轻松的配置代理服务器的中间件,让Node.js代理变得简单 url路径 foo://example.com:8042/over/there?name=ferret#nose \_/ \___ ...

  7. Connect is a middleware layer for Node.js

     Connect is a middleware layer for Node.js   http://senchalabs.github.com/connect Connect Connect is ...

  8. NTVS:把Visual Studio变成Node.js IDE 的工具

    NTVS(Node.js Tools for Visual Studio) 运行于VS2012或者VS2013.一些node.js的爱好者已经从PTVS(Python Tools for Visual ...

  9. 使用node.js开发一个生成逐帧动画小工具

    在实际工作中我们已经下下来不下于一万个npm包了,像我们熟悉的 vue-cli,react-native-cli 等,只需要输入简单的命令 vue init webpack project,即可快速帮 ...

随机推荐

  1. 细说HTTP上篇

    HTTP概述 每天,都有数以亿万计的JPEG图片.HTML页面.文本文件.MPEG电影.WAV音频文件.Java小程序和其他资源在因特网上游弋.HTTP可以从遍布全世界的Web服务器上将这些信息快速. ...

  2. [转]linux awk命令详解

    原文链接 : http://blog.chinaunix.net/uid-23302288-id-3785105.html   awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢 ...

  3. django signal 浅析

    默认的signals极其参数 (django 1.6.5) 模型的(django/db/models/signal.py): from django.dispatch import Signal cl ...

  4. 隐藏Nginx/Apache版本号的安全性与方法

    一.先介绍nginx隐藏版本号的方法. 搭建好nginx或者apache,为了安全起见我们都会隐藏他们的版本号,这边讲的是nginx的版本号,如果你也想隐藏apache的版本号,那请点前面的链接.请看 ...

  5. 【OpenStack】OpenStack系列11之namaspace&openvswitch原理实践

    Namespace实现网络隔离与互通 新建ns: ip netns add foo 查看ns: ip netns 查看ns详细配置: ip netns exec foo ip addr 设置ns内部l ...

  6. makefile中的自动化变量$@,$%,$

    转自:http://www.2cto.com/os/201302/191344.html   makefile中的自动化变量$@,$%,$   自动化变量  模式规则中,规则的目标和依赖文件名代表了一 ...

  7. Effecvtive C++笔记:让自己习惯C++

    条款01:视C++为一个语言联绑 C++的四个语言层次: C:C++是以C为基础的.基本数据类型.语句.预处理器.数组.指针等统统来自C. Oject-Oriented C++:面向对象这一特性包含了 ...

  8. 2.7 编程之美--最大公约数的3种解法[efficient method to solve gcd problem]

    [本文链接] http://www.cnblogs.com/hellogiser/p/efficient-method-to-solve-gcd-problem.html [题目] 求两个正整数的最大 ...

  9. 12.从上往下遍历二元树[LevelOrderOfBinaryTree]

    [题目] 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印. 例如输入 8    /  \   6    10  /\     /\ 5  7   9  11 输出8    ...

  10. redis 初探

    2014年6月24日 17:50:57 解压redis后进入源码目录,只用执行make命令就可以完成安装了 安装完成后到src目录里,将 redis-server redis-cli redis.co ...