四、提供静态文件服务

  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. LeetCode258:Add Digits

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...

  2. 解决 Unable to load DLL 'OraOps9.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)

    这个问题网上的答案是把oracle的home文件夹权限变为完全控制,然而并没有好用,还有一种方法是在编写的程序的config文件加入 <runtime> <legacyCorrupt ...

  3. SQL语句查找重复记录

    select * from AM_C4_ENTRY t where t.created_by in ( select t.created_by from AM_C4_ENTRY t group by ...

  4. JS制作的简单的三级及联

    前台: <form id="form1" runat="server"> <div> 省 <select id="Pro ...

  5. 第三次作业之Calculator项目随笔

    附:Github的链接:https://github.com/mingyueanyao/object-oriented/tree/master/Calculator 1.初见题目: 第一眼看到题目最大 ...

  6. C#与C++对应的类型

    //c++:HANDLE(void   *)       ----   c#:System.IntPtr         //c++:Byte(unsigned   char)   ----    c ...

  7. hdoj 5373 The shortest problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5373 一开始想到用整除11的性质去做,即奇位数的和和偶位数的和的差为11的倍数,但估不准数据范围没敢去 ...

  8. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

  9. Eclipse 安装对 Java 8 的支持

    Java 8 正式版今天已经发布了(详情),但最常用的 Java 开发工具 Eclipse 还没有正式发布对 Java 8 的支持.不过目前可以通过更新 JDT 来支持 Java 8.步骤如下: 菜单 ...

  10. Web CORS 跨域方式使用方式

    CORS 参考 http://enable-cors.org/index.html https://help.aliyun.com/document_detail/oss/practice/cors_ ...