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. CocoStudio基础教程(5)使用CocoStudio场景编辑器关联组件

    1.概述 我们有了UI交互.有了动画人物.有了物理模拟,还差最后一步——将这些元素融合起来.这就要用到cocoStudio中的场景编辑器了.这次我们要将先前我们做过的所有东西都放到一个场景中去.这项工 ...

  2. cocos基础教程(5)数据结构介绍之cocos2d::Vector

    cocos2d::Vector cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器.cocos2d::Vector<T>中的元素是按序存取的,它的低层实 ...

  3. 微信公众平台开发(十) 消息回复总结——用其xml模板

    一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...

  4. MySQL之aborted connections和aborted clients

    影响Aborted_clients 值的可能是客户端连接异常关闭,或wait_timeout值过小. 最近线上遇到一个问题,接口日志发现有很多超时报错,根据日志定位到数据库实例之后发现一切正常,一般来 ...

  5. [Android教程]EditText怎样限制用户的输入?数字/字母/邮箱

    有输入必有验证.为了防止用户随便输入确保提交数据的合法性,程序不得不在文本输入框(EditText)中增加限制或验证. 关于输入类型有数字.字母.邮箱.电话等形式,这些具体得根据业务来.那么Andro ...

  6. Java 23种设计模式

    转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...

  7. Linux system V

    Sysvinit 的小结 Sysvinit 的优点是概念简单.Service 开发人员只需要编写启动和停止脚本,概念非常清楚:将 service 添加/删除到某个 runlevel 时,只需要执行一些 ...

  8. raw格式镜像文件压缩并转换为qcow2格式

    raw格式文件,这个比较占用空间,你可以用以下命令将其压缩并转换成qcow2格式. # virt-sparsify --compress --convert qcow2 ubuntu.img ubun ...

  9. 如何使用setup.py文件

    setup.py文件的使用:% python setup.py build #编译% python setup.py install    #安装% python setup.py sdist     ...

  10. Object-c 控制语句

    控制语句: 分支语句   if-else  有控制机制    switch 循环语句   while    do-while  for 跳转语句   break,continue,goto