四、提供静态文件服务

  1、创建一个静态文件服务器

  __dirname ,取值是该文件所在咋目录路径。分散在不同目录中的文件可以有不同的值。

/**
* 最进本的ReadStream静态文件服务器
*/
var http = require('http');
var parse = require('url').parse;
var join = require('path').join;
var fs = require('fs'); var root = __dirname;
var server = http.createServer(function(req,res){
var url = parse(req.url);
var path = join(root,url.pathname); //构造绝对路径
var stream = fs.createReadStream(path); //创建fs.ReadStream
stream.on('data',function(chunk){ //将文件数据写到响应中
res.write(chunk);
});
stream.on('end',function(){
res.end();
});
});
server.listen(3000);

  这个文件服务器大体能用,但还有很多细节需要考虑。

  

  管道和水管:

  Node中的管道让来自源头(ReadableStream)的数据,流动到目的地(WriteableStream),我们用pipe方法把管道连接起来。

ReadableSteam.pipe(WriteableStream);

  读取一个文件(ReadableStream)并把其中的内容写到另一个文件中(WriteableStream)用的就是管道

var readStream = fs.createReadSteam('./original.txt')
var writeStream = fs.createwriteStrem('./copy.tet')
readStream.pipe(writeStream)

  所有ReadableStream都能接入任何一个WriteableStream。比如HTTP请求(req)对象就是ReadableStream.

  2、处理服务器错误

  在Node中,所有集成了EventEmitter的类都可能发出error时间。

  用fs.stat()实现先发制人的错误处理

  因为传输的文件是静态的,所以我们可以用stat()系统调用获取文件的相关信息,比如修改时间、字节数等。

/**
*检查文件是否存在,并在响应中提供Content-Length
*/ var server = http.createServer(function(req,res){
var url = parse(req.url); //解析URL以获取路径名
var path = join(root,url.pathname);
fs.stat(path,function(err,stat){ //检查文件是否存在
if(err){
if('ENOENT' == err.code){
res.statusCode = 404;
res.end('Not Found');
}else{
res.setHeader('Content-Length',stat.size); //用Stat对象的属性设置Content-Length
var stream = fs.createReadStream(path);
stream.pipe(res);
stream.on('error',function(err){
res.statusCode = 500;
res.end('Internal Server Error');
});
}
}
});
});

  

五、从表单中接受用户输入

  1、处理提交的表单域 

  表单提交请求带的Content-Type值通常有两种

  A、application/X-www-form-urlencoded: 这是HTML表单默认值

  B、multipart/form-data: 在表单中含有文件或非ASCII或二进制数据使用。

/**
* 支持GET和POST的HTTP服务器.
*/
var http = require('http');
var items = [];
var server = http.createServer(function(req,res){
if('/' == req.url){
switch (req.method){
case 'GET':
show(res);
break;
case 'POST':
add(req,res);
break;
default:
badRequest(res);
}
} else{
notFound(res);
}
});
server.listen(3000); /*待办事项列表页面的表单和事项列表*/
function show(res){
var html = '<html><head><title>TODO LIST</title></head><body>'
+'<h1>TODO LIST</h1>'
+'<ul>'
+items.map(function(item){
return '<li>'+item+'</li>'
}).join('')
+'</ul>'
+'<form method="post" action="/">'
+'<p><input type="text" name="item" /></p>'
+'<p><input type="submit" value="Add Item" /></p>'
+'</form></body></html>';
res.setHeader('Content-Type','text/html');
res.setHeader('Content-Length',Buffer.byteLength(html));
res.end(html);
} /*notFound()函数接受响应对象,将状态吗设为404,响应主体设为Not Found*/
function notFound(res){
res.statusCode = 404;
res.setHeader('Content-Type','text/plain');
res.end('NOT FOUND');
} /*返回400 Bad Request响应的函数实现起来跟notFound()几乎一样*/
function badRequest(res){
res.statuCode = 400;
res.setHeader('Content-Type','text/plain');
res.end('BadRequest');
}
/*最后还要实现add()函数,它会接受req和res连个对象*/
var qs = require('querystring');
function add(req,res){
var body='';
req.setEncoding('utf8');
req.on('data',function(chunk){
body += chunk;
});
req.on('end',function(){
var obj = qs.parse(body);
items.push(obj.item);
show(res);
});
}

NODE编程(四)--构建Node Web程序2的更多相关文章

  1. 【Web探索之旅】第四部分:Web程序员

    内容简介 1.第四部分第一课:什么是Web程序员? 2.第四部分第二课:如何成为Web程序员? 3.第四部分第三课:成为优秀Web程序员的秘诀 第四部分:Web程序员(完结篇) 大家好.终于来到了[W ...

  2. 深入理解JS异步编程四(HTML5 Web Worker)

    >Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker We ...

  3. NODE编程(三)--构建Node Web程序1

    一.HTTP服务器的基本知识 1.Node如何向开发者呈现HTTP请求 Node中的http模块提供了HTTP服务器和客户端接口: var http = require('http'); 创建HTTP ...

  4. 使用Node.js的socket.io模块开发实时web程序

    首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统 ...

  5. Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例

    目录 前言 新建项目.建立数据库以及其它准备工作 新建express + ejs 项目:sampleEjs 创建数据库 修改package.json文件,安装session和mysql模块 样式和JQ ...

  6. 实战案例--Grunt构建Web程序

    GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...

  7. node.js之十大Web框架

    之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...

  8. Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例

    前言 上一篇学习了一些构建网站会用到的一些知识点:https://www.cnblogs.com/flyingeagle/p/9192936.html 这一篇主要结合前面讲到的知识,去构建一个较为完整 ...

  9. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  10. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计

    前言 近来公司需要构建一套 EMM(Enterprise Mobility Management)的管理平台,就这种面向企业的应用管理本身需要考虑的需求是十分复杂的,技术层面管理端和服务端构建是架构核 ...

随机推荐

  1. Cisco ASA5500系列防火墙恢复IOS全过程

    擦除防火墙配置的命令是write erase而不是erase flash!当ASA5510的flash被erase后,如何将新的IOS拷贝到5510内呢? 如下:1. 当flash被erase后设备会 ...

  2. 正则表达式匹配中文字符串的文章URL

    http://www.cnblogs.com/yitian/archive/2008/11/14/1333569.html

  3. MyEclipse中无法将SVN检出来的项目部署到tomcat中

    自己遇到的小问题  : 要以web项目方式从svn上倒下来才可以部署到tomcat下检出步骤: myEclipse -->File-->new-->other-->svn--& ...

  4. Codeforces 118 D. Caesar's Legions (dp)

    题目链接:http://codeforces.com/contest/118/problem/D 有n个步兵和m个骑兵要排成一排,其中连续的步兵不能超过k1个,连续的骑兵不能超过k2个. dp[i][ ...

  5. HDU1712简单的分组背包

    HDU1712http://acm.hdu.edu.cn/showproblem.php?pid=1712 简单的分组背包 #include <map> #include <set& ...

  6. jquery的clone方法bug的修复

    最近发现jquery的clone的bug,textarea和select的jquery的clone方法有问题,textarea和select的值clone的时候会丢掉,在网上发现一个插件,下载地址如下 ...

  7. 使用Map List 封装json数据

    <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</art ...

  8. iOS单例 宏定义

    #define singleton_interface(className) \ + (className *)shared##className; // @implementation #defin ...

  9. ACM数学问题分类(汇总帖)

    数论 组合数学 计算几何 博弈论 线性代数 高等数学 线性规划 概率统计

  10. Oracle和plsql developer编码设置

    在使用pl/sql developer时,查询出来中文字段显示乱码,因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 一.查看和修改oracle数据库字符集 selec ...