node.js学习(2)--路由功能以及表单上传
今天按照《node.js入门》这本书学习了node的一些基础知识,包括服务器的创建,路由功能的实现,表单上传和数据处理,感觉开始明白了node.js的一些基本原理。这本书说的很详细也很基础,很适合初学者学习。node.js入门
众所周知,node跟php语言不一样,node不需要依赖于apache等服务器,因为node本身就能够构建服务器!所以,再用node开发网站之前我们首先得学会如何搭建服务器。关于node创建服务器在我之前的博客已经有介绍,这里不再赘述。
完成一个表单上传与数据处理的demo
1.明确功能,先确定需要建立哪些文件(由于只是demo,我们不需要写html文件,涉及前端的简单处理就好。)
服务器文件server.js;程序入口文件index.js;路由文件router.js;请求处理文件 handleRequest.js
首先我们来写入口文件:
<span style="font-size:18px;">var server= require("./server.js");//引入server.js var router = require("./router.js"); var handle = require("./requestHandlers"); var handles ={};//关联数组用来传递函数。 handles["/"] = handle.start;//这里主要是为了后面的路由功能,用户访问localhost:3000/start就会直接转到start方法 handles["/start"] = handle.start; handles["/upload"] = handle.upload; server.start(router.route,handles);</span>
在index文件里面,我们初始化一个关联数组,用来存放需要用到的函数。并且开启服务器。
server文件:
<span style="font-size:18px;">var http = require("http"); //node.js 自带的http模块 var url= require("url"); function start(route,handles){ //创建一个HTTP服务器; http.createServer( function (req, res) { //匿名函数 //大部分服务器会在用户尝试访问localhost:8888时候访问localhost:8888/favicon.ico,这里去除这一访问结果 if(req.url == '/favicon.ico'){ return; } var postData = ""; var pathname = url.parse(req.url).pathname;//解析出url里面的路径名 req.setEncoding("utf8"); req.addListener("data",function(postDataChunk){//通过回调函数的方式获取post数据 postData += postDataChunk ; }); req.addListener("end",function(){ route(handles,pathname,res,postData); }); console.log("Requset"+pathname+"arrived!"); }).listen(3000);//侦听3000端口号 console.log("HTTP server has started!"); } //将server中的代码写在一个start函数里面。并且将该函数导出,一次完成代码的模块化,在其余的文件中只需要以 var http = require("http")的形式进行调用; exports.start = start;</span>
首先,我们设置了接收数据的编码格式为 UTF-8,然后注册了“data”事件的监听器,用于收集每次接收到的新数据块,并将其赋值给 postData 变量,最后,我们将请求路由的调用移到 end 事件处理程序中,以确保它只会当所有数据接收完毕后才触发,并且只触发一次。我们同时还把 POST 数据传递给请求路由,因为这些数据,请求处理程序会用到。为了使整个过程非阻塞,Node.js会将POST数据拆分成很多小的数据块,然后通过触发特定的事件,将这些小数据块传递给回调函数。这里的特定的事件有
data 事件(表示新的小数据块到达了)以及 end 事件(表示所有的数据都已经接收完毕)。
router.js:
<span style="font-size:18px;">function route(handles,pathname,res,postData){ console.log("About to route a request to"+pathname); if(typeof handles[pathname] === 'function'){//通过对路径名称的判断,调用相应的函数进行处理,这是路由的基本思想。 handles[pathname](res,postData); }else{ console.log("No request handler found for " + pathname); } } exports.route=route;</span>
route函数传递三个参数,关联数组handles(保存requestHandlers里面的函数),pathname是访问路径,res是回应对象,postData是post接收的数组。
requestHandles.js
var querystring = require("querystring"); function start(res){ 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>'; console.log("Request Handlers for 'start' was called"); res.writeHead(200,{"Content-Type":"text/html"}); res.write(body); res.end(); } function upload(res,postData){ res.writeHead(200,{"Content-Type":"text/plain"}); var temp_data = querystring.parse(postData).text; res.write(temp_data); res.end(); console.log("Reques Handlers for 'upload ' was called"); } exports.start = start; exports.upload = upload;这个页面里面,start函数首先向用户发送了一个网页,包含输入框和按钮,用户输入文字点击提交,数据被传入upload文件并显示。upload文件用于显示。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。