四、提供静态文件服务

  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. hdu1166-敌兵布阵(线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 区间更新,区间求和 // File Name: hdu1166.cpp // Author: bo_jwo ...

  2. iOS单例 宏定义

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

  3. Gartner: Hype Cycle for Emerging Technologies-2012 (技术成熟度曲线) [转]

      英文稿: The “Hype Cycle for Emerging Technologies” report is the longest-running annual Hype Cycle, p ...

  4. 第一章TP-Link 703N刷OpenWrt

    1)下载编译好的固件 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin openwrt-ar71xx-generic-tl-wr703n ...

  5. Chrome developer tool:本人钟爱的 console、Network 功能简谈

    在最开始时,本人调试查看网页,一直用的是 firefox 的 firebug 插件,并没有使用 chrome 的 developer tool .只不过,在日常生活使用过程中,一直使用的是 chrom ...

  6. PHPCMS教程

    第一章 模版 参见:http://blog.163.com/zh_astro/blog/static/1842084562011430430419/ 碎片管理: 在模版页面需要添加碎片的位置加上代码{ ...

  7. Codeforces Beta Round #13 E. Holes 分块暴力

    E. Holes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/13/problem/E Des ...

  8. static使用方法小结

    static使用方法小结 statickeyword是C, C++中都存在的keyword, 它主要有三种使用方式, 当中前两种仅仅指在C语言中使用, 第三种在C++中使用(C,C++中详细细微操作不 ...

  9. loading-show-hide

    https://github.com/eltld/loading-show-hide

  10. [Angular 2] Controlling Rx Subscriptions with Async Pipe and BehaviorSubjects

    Each time you use the Async Pipe, you create a new subscription to the stream in the template. This ...