上节我们把服务器、路由和请求处理程序结合在一起了,下面就编写一个具体的 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(四)的更多相关文章

  1. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点

    一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...

  2. nodejs取参四种方法req.body,req.params,req.param,req.body

    摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现. 获取 ...

  3. 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. ...

  4. 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境

    思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...

  5. java程序员的NodeJS初识篇

    摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...

  6. NodeJs学习一NodeJs初识

    一.前言 按照惯例,先扯淡,就因为这货,现在才有了各大公司招聘的全栈工程师,正是因为它,让以前只会写前端的人也能写起后端服务器代码来了.所以呢,你招一个会NodeJs的前端,它都能把后端干了,一个人干 ...

  7. nodejs取参四种方法 req.body, req.params, req.param, req.body

    获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实现. req.body req.query req.params req.param() 首先介 ...

  8. 初识NodeJS

    1.JavaScript 模块化规范 浏览器环境 AMD Asynchronous Module Definition RequireJS CMD Common Module Definition S ...

  9. NodeJS入门(四)—— path对象

    很快Node就会迎来4.0的时代,届时将并入现有的iojs,所以先前写过的iojs入门系列直接更名为NodeJS入门. 本篇开始将逐个介绍Node的各主要模块,依循API文档走一遍,但会给出比API文 ...

随机推荐

  1. Java 作业 二

    编写一个Java应用程序,统计数组{1,3,4,7,2,1,1,5,2,5,7,2,1,1,3},统计显示每种数字其出现的次数以及出现最多和最少次数的数字. package hi; public cl ...

  2. 面试题fugui

    1.什么是栈溢出,在什么情况下可能会出现 栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当数据足够大时,将会溢出缓冲区的范围. python函数调用是通过栈这 ...

  3. React Native小白入门学习路径——五

    React Native小白入门学习路径--五 序 "哦天呐!" 这句话成了我在实验室的口头禅, 老师可能觉得我们都是大神吧,都还在看着基础就给布置了那么多任务:写一个RN的TDD ...

  4. [HNOI2007]神奇游乐园

    Description: 在方格图上找一条回路使经过的权值最小 Hint: \(n<=100,m<=6\) Solution: 一开始又看错题了...稍有细节的水题,详见代码 #inclu ...

  5. pythonweb服务器编程(三)

    Web静态服务器-2-显示需要的页面 #coding=utf-8 import socket from multiprocessing import Process import re def han ...

  6. 解压文件出错解决方法(invalid compressed data--format violated)

    解压缩出现这个报错: 1.考虑是否传输过程出错,重新传输试试. 2.使用传输工具时,选择二进制试试. 3.使用传输工具时,选择ASCII试试. 解压缩命令: gzip  -d filename gun ...

  7. 11、python阶段测试

    1.执行Python脚本的两种方式 如果想要永久保存代码,就要用文件的方式 如果想要调试代码,就要用交互式的方式 2.Pyhton单行注释和多行注释分别用什么? 单行注释:# 多行注释: '' &qu ...

  8. 【记】研究Sharding-JDBC遇到的一个异常(Caused by: io.shardingsphere.core.exception.ShardingException: Cannot get uniformed table structure for `t`. The different meta data of actual tables are as follows)

    一.异常信息 Caused by: io.shardingsphere.core.exception.ShardingException: Cannot get uniformed table str ...

  9. jQuery鼠标悬停3d菜单展开动画

    效果体验:http://hovertree.com/texiao/jquery/93/ 竖直的主菜单贴着页面左侧,当光标移入菜单项时,以3D动画的方式弹出对应的二级菜单.采用jQuery和CSS3实现 ...

  10. Android的Databinding-RecyleView绑定

    public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserHolder> { private static ...