NODE编程(四)--构建Node Web程序2
四、提供静态文件服务
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的更多相关文章
- 【Web探索之旅】第四部分:Web程序员
内容简介 1.第四部分第一课:什么是Web程序员? 2.第四部分第二课:如何成为Web程序员? 3.第四部分第三课:成为优秀Web程序员的秘诀 第四部分:Web程序员(完结篇) 大家好.终于来到了[W ...
- 深入理解JS异步编程四(HTML5 Web Worker)
>Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker We ...
- NODE编程(三)--构建Node Web程序1
一.HTTP服务器的基本知识 1.Node如何向开发者呈现HTTP请求 Node中的http模块提供了HTTP服务器和客户端接口: var http = require('http'); 创建HTTP ...
- 使用Node.js的socket.io模块开发实时web程序
首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统 ...
- Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例
目录 前言 新建项目.建立数据库以及其它准备工作 新建express + ejs 项目:sampleEjs 创建数据库 修改package.json文件,安装session和mysql模块 样式和JQ ...
- 实战案例--Grunt构建Web程序
GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...
- node.js之十大Web框架
之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...
- Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例
前言 上一篇学习了一些构建网站会用到的一些知识点:https://www.cnblogs.com/flyingeagle/p/9192936.html 这一篇主要结合前面讲到的知识,去构建一个较为完整 ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计
前言 近来公司需要构建一套 EMM(Enterprise Mobility Management)的管理平台,就这种面向企业的应用管理本身需要考虑的需求是十分复杂的,技术层面管理端和服务端构建是架构核 ...
随机推荐
- poj 2239 Selecting Courses(二分匹配简单模板)
http://poj.org/problem?id=2239 这里要处理的是构图问题p (1 <= p <= 7), q (1 <= q <= 12)分别表示第i门课在一周的第 ...
- ThinkPad X200s 安装 Mac OSX
===================先说一下注意事项================== 无论任何安装方法(U盘.光盘)不能进入安装界面,或者鼠标无法移动.那就在变色龙引导界面加入以下代码 cpus ...
- LeetCode 刷题记录(二)
写在前面:因为要准备面试,开始了在[LeetCode]上刷题的历程.LeetCode上一共有大约150道题目,本文记录我在<http://oj.leetcode.com>上AC的所有题目, ...
- 用 const 限定类的成员函数
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于 ...
- ebj笔记
所有EJB3.0开发商都必须提供一个JMS provider的实现,JMS provider对于message-driven bean而言绝对是必须的.JMS是一套用于访问企业消息系统的开发商中立的A ...
- web/jdbc数据库带实例名连接2008
--------------------------数据库带实例名连接2008-------------------------------------<property name=" ...
- [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝
一般连接sql数据库,IP_connstr="driver={SQL Server}; server=127.0.0.1;database=数据库名字;uid=sa;pwd=密码" ...
- JedisPool使用原理和源代码
1,JedisPool的使用 <!-- 连接池的配置信息 --><beanid="jedisConfig"class="redis.clients.je ...
- Ext.form.ComboBox 后台取值 动态加载 ext5.0.0
我用的extjs是5.0.0版本的. 请注意:如果这里没有的combobox相关内容,这里一定有. 开始的时候keyup事件取到的数据就是放不到ComboBox中,放全局变量也不好用.最后大神出手帮忙 ...
- Extjs Google的Suggest的自动提示 从后台取数据
//服务器取数据 var remoteStore = Ext.create('Ext.data.Store', { proxy: ({ type: "ajax", url:&quo ...