胡扯
好多语言要学呀!最近又开始写nodejs,有那么一点累的说。
概述
该篇文章主要是记录下今天入门nodejs写的几个代码,也算是一个小程序。之后的代码应该都可以按照这种模式进行开发,不过之后应该会用到框架,所以开发就会有一定的不同。
下面的代码的主要有:入口程序 > 服务器 > 路由 > 处理程序,而请求反应也是按照这样的逻辑进行层层的深入。
这里只是作个简单的记录,希望之后会越来越好。更加详细的内容请访问Node 入门。
入口程序(index.js)
//作为网站的入口
//并引导到服务器中
var server = require('./server');
var router = require('./router');
var requestHandlers = require('./requestHandlers');
//handle是一个对象,可以通过键值对的方式添加成员属性和成员函数
var handle = {}
//通过这样的数据结构,可以有效的代替switch和if结构
// 这样代码会更加的简洁、清晰
handle['/'] = requestHandlers.start;
handle['/start'] = requestHandlers.start;
handle['/upload'] = requestHandlers.upload;
handle['/index'] = requestHandlers.index;
handle['/show'] = requestHandlers.show;
server.start(router.route,handle);
/*
请求 》》 服务器 》》 路由 》》 处理程序
*/
服务器(server.js)
//http服务器,可以处理请求,也可以将请求放到处理程序中处理
//引导到路由中,路由对不同路径进行引导到不同处理方法中,具体处理在处理程序中处理
//http模块
var http = require('http');
var url = require('url');
//这里将router从服务器开始引导
function start(route, handle){
function onRequest(request,response){
var postData = '';
var pathname = url.parse(request.url).pathname;
console.log('request for ' + pathname + ' received');
//服务器作为接受用户请求的直接端,这里直接处理服务器的请求
//设置编码格式
request.setEncoding('utf8');
//添加监听事件,用于对请求进行回调处理
//处理请求
request.addListener('data', function(postDataChunk){
postData += postDataChunk;
console.log('Receive Post data chunk "' + postData + '".');
});
//处理请求后的程序
request.addListener('end', function(){
route(handle, pathname, response, postData);
});
response.writeHead(200, {'Content-type':'text/plain'});
// response.write(content);
// response.end();
}
//调用函数,该函数返回一个对象,该对象有方法listen,并指定侦听端口
//作为参数的函数是作为回调使用的回调函数
//回调函数的连个参数都是对象,各自都有自己的方法
http.createServer(onRequest).listen(8080);
console.log('Server has started');
}
//模块化,导出函数(功能)
exports.start = start;
路由(router.js)
//将不同的url映射到请求引导到不同的请求处理程序
//将路径进行引导
function route(handle, pathname,response,postData){
console.log('about to route a request for ' + pathname);
if(typeof handle[pathname] == 'function'){
//如果是函数,则运行
//利用这种类似于关联数组的方式,可以是代码简洁流畅
handle[pathname](response, postData);
}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 exec = require('child_process').exec;
var querystring = require('querystring');
var fs = require('fs'); //读取本地文件外部模块
function start(response, postData){
console.log('start');
function sleep(milliSeconds){
var startTime = new Date().getTime();
while(new Date().getTime() < startTime + milliSeconds);
}
//为每个请求启动一个子线程进行处理
//休眠10s
exec('dir /s/a C:',{timeout:10000, maxBuffer:20000*1024},function(error,stdout,stderr){
// sleep(10 * 1000);
response.writeHead(200,{'COntent-type':'text/plain'});
response.write(stdout);
response.end();
});
}
function index(response, postData){
console.log('index');
var body = '<html>' +
'<head>'+
'<meta http-equiv = "Content-type" content="text/html;' +
'charset=UTF-8" />'+
'<body>'+
'<form action="/upload" method="post">'+
'<textarea name="text" rows="20" cols="60"></textarea>'+
'<input type="submit" value="submit text" />'+
'</form>'+
'</body>'+
'</html>';
response.writeHead(200,{"Content-type":"text/html"});
response.write(body);
response.end();
}
function upload(response, postData){
console.log('upload');
response.writeHead(200,{'Content-type':'text/plain'});
response.write('here is uploa\n');
response.write('postData (without querystring) is :' + postData + '\n');
response.write('postData is :' + querystring.parse(postData).text + '\n');
response.end();
}
function show(response, postData){
console.log('show');
//读取本地文件,读取完成后进行回调(果然是事件驱动呀)
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.index = index;
exports.show = show;