标签:
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;
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;
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);
-->>cmd 指定到node安装文件夹,输入 :node index.js
-->>url中输入 http://localhost:8888/start
-->>提交后 可以看到post 过来的参数输出到页面。
学习地址:http://ourjs.com/detail/529ca5950cb6498814000005#javascript-and-nodejs
标签:
原文地址:http://www.cnblogs.com/jiangshuilang/p/4459994.html