【nodejs】初识 NodeJS(四)
上节我们把服务器、路由和请求处理程序结合在一起了,下面就编写一个具体的 web 应用。
上传图片的 web 应用
服务器模块(server.js)
var http = require('http');
var url = require('url');
function start(route, handler) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log('Request ' + pathname + ' received.');
route(handler, pathname, response, request);
}
http.createServer(onRequest).listen(8888);
console.log('Server has started.');
}
exports.start = start;
路由模块(route.js)
function route(handler, pathname, response, request) {
console.log('Route a request for ' + pathname);
if (typeof handler[pathname] === 'function') {
handler[pathname](response, request);
} else {
console.log('No request handler found for ' + pathname);
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write('404 Not Found');
response.end();
}
}
exports.route = route;
请求处理程序模块(requestHandlers.js)
var querystring = require('querystring'),
fs = require('fs'),
formidable = require('formidable'); // 如果 formidable 模块是全局安装,只能绝对路径调用,如果本地安装,require(formidable)
function start(response) {
console.log('Request handler "start" was called.');
var body = '<html>' +
'<head>' +
'<meta http-equiv="Content-Type" content="text/html; ' +
'charset=UTF-8" />' +
'</head>' +
'<body>' +
'<form action="/upload" enctype="multipart/form-data" method="post">' +
'<input type="file" name="upload">' +
'<input type="submit" value="Upload file">' +
'</form>' +
'</body>' +
'</html>';
response.writeHead(200, {
'Content-Type': 'text/html'
});
response.write(body);
response.end();
}
function upload(response, request) {
console.log('Request handler "upload" was called.');
var form = new formidable.IncomingForm();
form.uploadDir = 'tmp';
form.parse(request, function(error, fields, files) {
console.log('parsing done');
fs.renameSync(files.upload.path, './tmp/test.png');
response.writeHead(200, {
'Content-Type': 'text/html'
});
response.write('Received image:<br>');
response.write('<img src="/show">');
response.end();
});
}
function show(response) {
console.log('Request handler "show" was called.');
fs.readFile('./tmp/test.png', 'binary', function(error, file) {
if (error) {
response.writeHead(500, {
'Content-Type': 'text/plain'
});
response.write(error + '\n');
response.end();
} else {
response.writeHead(200, {
'Content-Type': 'image/png'
});
response.write(file, 'binary');
response.end();
}
});
}
exports.start = start;
exports.upload = upload;
exports.show = show;
主文件(index.js)
var server = require('./server');
var route = require('./route');
var requestHandlers = require('./requestHandlers');
var handler = {};
handler['/'] = requestHandlers.start;
handler['/start'] = requestHandlers.start;
handler['/upload'] = requestHandlers.upload;
handler['/show'] = requestHandlers.show;
server.start(route.route, handler);
打开终端,启动服务器 node index,浏览器输入 http://localhost:8888/start,上传图片功能就可以使用了。选择一张本地图片,将其上传到服务器,然后浏览器就会显示该图片。
【nodejs】初识 NodeJS(四)的更多相关文章
- 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点
一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...
- nodejs取参四种方法req.body,req.params,req.param,req.body
摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现. 获取 ...
- 67.nodejs取参四种方法req.body,req.params,req.param,req.body
转自:http://www.cnblogs.com/jkingdom/p/8065202.html 摘要: nodejs取参四种方法req.body,req.params,req.param,req. ...
- 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境
思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...
- java程序员的NodeJS初识篇
摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...
- NodeJs学习一NodeJs初识
一.前言 按照惯例,先扯淡,就因为这货,现在才有了各大公司招聘的全栈工程师,正是因为它,让以前只会写前端的人也能写起后端服务器代码来了.所以呢,你招一个会NodeJs的前端,它都能把后端干了,一个人干 ...
- nodejs取参四种方法 req.body, req.params, req.param, req.body
获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实现. req.body req.query req.params req.param() 首先介 ...
- 初识NodeJS
1.JavaScript 模块化规范 浏览器环境 AMD Asynchronous Module Definition RequireJS CMD Common Module Definition S ...
- NodeJS入门(四)—— path对象
很快Node就会迎来4.0的时代,届时将并入现有的iojs,所以先前写过的iojs入门系列直接更名为NodeJS入门. 本篇开始将逐个介绍Node的各主要模块,依循API文档走一遍,但会给出比API文 ...
随机推荐
- Struts2网页面传值两种方式
第一种方式: /** 列表 */ public String list() throws Exception { List<Role> roleList = roleService.fin ...
- python 数据类型元组与字典内置方法
1.元组 (1)元组是不可变的列表,能存多个值:如果多个值只有取得需求,没有改的需求,用元组最合理 (2)定义:在()内用逗号隔开,可以存任意类型的值 注意:当元组只有一个元素时,要在后面加逗号 # ...
- CY7C68013 USB接口相机开发记录 - 第三天:固件修改
上篇说了驱动怎么配置,这篇记录下对应的设备固件怎么配置.首先看下我们工程结构: 摘自官方文档AN61345 STARTUP.A51是建立工程时自动生成的文件,下面所有文件都是手动添加的.对于下面的几个 ...
- BZOJ4479 : [Jsoi2013]吃货jyy
若$k\leq 15$,那么可以设$d[i][S]$表示经过了$S$集合的边,现在位于$i$点的最短路. 可以用Dijkstra算法在$O(n^22^k)$时间内求出. 否则若$k>15$,那么 ...
- C++程序设计方法4:类模板
类模板 在定义类时也可以将一些类型抽象出来,用模板参数来替换,从而使类更具有通用性.这种类被称为模板类,例如: template <typename T> class A { T data ...
- Map集合架构总结
说明;这里先学习Map集合,然后再学习Set集合,是因为Set集合中的HashSet依赖于hashMap,就是通过hashMap集合来实现的,TreeSet集合依赖于TreeMap集合,TreeSet ...
- tablespace(表空间) / segment(断) / extent(盘区)/ block(块)/datafile(文件)之间的关系
tablespace(表空间) / segment(断) / extent(盘区)/ block(块)之间的关系 tablespace : 一个数据库划分为一个或多个表逻辑单位,即表空间,每个表空 ...
- JQ03
JQ03 1.val方法 val方法用于设置和获取表单元素的值,如input/textarea 1)设置与获取: .val("需要设置的字符串"): .val();//获取字符串 ...
- Linux curl命令使用代理、以及代理种类介绍(转)
Linux curl命令使用代理.以及代理种类介绍 本文转自http://aiezu.com/article/linux_curl_proxy_http_socks.html,感谢作者 有时出于个 ...
- 01、Spar内核架构原理
附件列表