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. HDU 4883 TIANKENG’s restaurant

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4883 解题报告:一家餐馆一天中有n波客人来吃饭,第 i 波  k 客人到达的时间是 s ,离开时的时间 ...

  2. Powershell学习之道-文件夹共享及磁盘映射

    导读 在Linux环境下,我们很轻易就能得心应手地通过命令操作一切事物,在Windows下,Powershell也算是后起之秀,提供大量的cmdlet以及c#的横向拓展.下面将由小编带领大家通过Pow ...

  3. NGUI之scroll view制作,以及踩的坑总结

    http://blog.csdn.net/monzart7an/article/details/23878505 链接: http://game.ceeger.com/forum/read.php?t ...

  4. 如何在linux中用命令产生一个范围内的随机数?

    在shell中有一个环境变量RANDOM,它的范围是0--32767 如果我们想要产生0-25范围内的数,如何做呢?如下: $RANDOM%26 用这个环境变量对26取模,就可以得到最小是0,最大是2 ...

  5. Ubuntu系统如何查看硬件配置信息

    查看ubuntu硬件信息 1, 主板信息 .查看主板的序列号 -------------------------------------------------- #使用命令 dmidecode | ...

  6. 动态设置Div坐标

    <style type="text/css"> #main{text-align:center; background-color:#9FF; height:600px ...

  7. VIM替换、截取及追加操作

    参考: http://blog.csdn.net/love__coder/article/details/6739670 http://blog.csdn.net/love__coder/articl ...

  8. 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

  9. codeforces 467C.George and Job 解题报告

    题目链接:http://codeforces.com/problemset/problem/467/C 题目意思:给出一条含有 n 个数的序列,需要从中找出 k 对,每对长度为 m 的子序列,使得 找 ...

  10. python——生成器

    python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...