轻轻敲开nodeJs的大门--第一个nodeJs入门小程序

胡扯
好多语言要学呀!最近又开始写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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值