使用Node 搭建简单Web服务器(二)

Web服务器的的封装,以及解析路由,和获得post传入的参数

1.封装

server.js

// 最终服务端————简单的服务器

var http = require("http"); //在node中,可以使用require()函数来加载模块. 
var url = require("url");//加载url模块
function start(route, handler) {
    function OnRequest(request, response) {
        var postData = "";
        var pathname = url.parse(request.url).pathname; //获得url地址

        request.setEncoding("utf-8");//设置了接收数据的编码格式为UTF-8

        request.addListener("data", function (postDataChunk) { //注册了“data”事件的监听器,用于收集每次接收到的新数据块,并将其赋值给postData 变量
            postData += postDataChunk;
            console.log("POST 被接收......");
        })
        request.addListener("end", function () { //当接收到所有数据,触发end事件后

            //handler,(需要执行的方法)
            route(pathname, handler, response,postData); //把所有有关  response 的调用都放入 route
        })
    }
    http.createServer(OnRequest).listen(8888);
    console.log("Server has Started...");
}
exports.start = start; //start是一个方法,调用

route.js

技术分享
function route(pathname, handler, response, postData) {
    //匹配用户的输入的url,是不是一个方法 function,是方法就把方法返回,不是就报错 Not Found 404
    if (typeof handler[pathname] == "function") {
        return handler[pathname](response,postData);
    } else {
        response.writeHead(200, { "Content-Type": "text/plain" });
        response.write("Not Found 404...");
        response.end();
    }
}
exports.route = route;
View Code

handler.js

技术分享
/*
在 route中被调用的方法
*/

/*
查询数据库,又或者是进行大量的计算会包含阻塞操作。形象的说就是“它阻塞了所有其他的处理工作”。
引入了一个新的Node.js模块,child_process。之所以用它,是为了实现一个既简单又实用的非阻塞操作:exec()。
*/
var exec = require("child_process").exec;
var querystrnig = require("querystring");//querystring模块,处理POST数据
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" method="post">‘ +
     ‘<textarea name="text" rows="20" cols="60"></textarea>‘ +
     ‘<input type="submit" value="Submit text" />‘ +
     ‘</form>‘ +
     ‘</body>‘ +
     ‘</html>‘;       //这里是一个HTML 页面的Form表单

    exec("ls -lah", function (error, stdout, stderr) {
        response.writeHead(200, { "Content-Type": "text/html" });
        //body = stdout;
        response.write(body);
        response.end();
    });
}

function upload(response, postData) {
    console.log("Request handler ‘upload‘ was called.");
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.write("您输入了:" + querystrnig.parse(postData).text);//textarea 的 name 为 text ,so  querystrnig.parse(postData).text
    response.end();
}
exports.start = start;
exports.upload = upload;
View Code

index.js  (解析路由)

技术分享
var server = require("./server"); //    ./server  获得node.exe 同级别目录下的server.js文件
var router = require("./route"); //获得 route.js文件
var requestHandlers = require("./handler"); //获得 handler.js文件
var handle = {};

//制定路由规则,在url中输入  /start 则返回  handler.js  中的 start 方法!!!
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;

server.start(router.route,handle);
View Code

 

-->>cmd 指定到node安装文件夹,输入 :node index.js

技术分享

 

-->>url中输入 http://localhost:8888/start

技术分享

-->>提交后 可以看到post 过来的参数输出到页面。

技术分享

 

学习地址:http://ourjs.com/detail/529ca5950cb6498814000005#javascript-and-nodejs

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。