这里我们将学习用POST的方式将资料传给Node.js的Web Server,以便进一步利用。
如果你还没有装Node.js,可参考:
‧在Windows安装Node.js和CoffeeScript超简单!!
如果你想知道如何用GET方式传资料,可参考上一篇:Node.jS初学者笔记(1)-用GET传送资料
我们将延续上一篇用GET方式的作法,改成POST之后,传送资料到Web Server。
Step 1-将表单改用POST传送
让我们资源回收一下,把之前signupform.html的表格,由GET改成POST即可。
signupform.html
<title>Node.js菜鸟笔记(2)</title><link rel="stylesheet" href="css/style.css" type="text/css" media="all" /> <h1>Node.js菜鸟笔记-注册</h1><form id="signup" method="POST" action="http://localhost:3000/Signup"> <label>使用者名称:</label><input type="text" id="username" name="username" /><br> <label>电子邮件:</label><input type="text" id="email" name="email" /><br> <input type="submit" value="注册我的帐号" /><br></form>
看到第9行,我们已经改成POST了,第一步就这样收工。当然title改成第二回比较不会错乱。
Step 2-监听data与end事件来处理POST
让我们先写出改成POST之后,需要的程式码。
app.coffee
http = require 'http'url = require 'url'qs = require 'querystring'server = http.createServer (req,res) -> urlData = url.parse req.url,true action = urlData.pathname res.writeHead 200,"Content-Type":"text/html" if action is "/Signup" formData = '' req.on "data",(data)-> formData += data req.on "end", -> user = qs.parse formData res.writeHead 200,"Content-Type":"text/html" res.end "<h1>#{user.username}欢迎您的加入</h1><p>我们已经将会员启用信寄至#{user.email}</p>" else res.end "<h1>欢迎光临Node.js菜鸟笔记</h1>" server.listen 3000console.log 'Server跑起来了,现在时间是:' + new Date()
第3行我们加入了'querystring'这个moduel,方便我们等一下解析由表单POST回来的资料。
第10行我们加入一个formData的变数,用来搜集待等一下表单回传的资料。
第11行开始,就是本文的重点了。对JavaScript有点认识的朋友,应该都知道JavaScript是一种事件驱动的语言,也就是说,它一直在监听着各种事件来决定它要如何工作;有事件,它才有动作。这种特性一样在node.js上体现。
在上一篇文章中,我们只从req拿出url的资料,这次我们要在它身上加上事件。JavaScript在订阅事件时使用addEventListener,而node.js使用的则是on。
第11行我们加上了监听'data'的事件,它会在浏览器传送资料到Web Server时被执行,参数是它所接收到的资料,型态是字串。第14行,我们加上'end'的事件,当浏览器的请求事件结束时,它就会动作。
由于浏览器使用POST在上传资料时,会将资料一块块地上传,因为我们在监听data事件时,透过formData变数将它累加起来。由于我们上传的资料很少,一次就结束,不过如果日后需要传的是资料比较大的档案,这个累加动作就很重要。
当资料传完,就进到end事件中,我们用到qs.parse来解析formData。formData的内容是字串,内容是:
username=wordsmith&email=wordsmith%40some.where
而qs.parse可以帮我们把这个querystring转成物件的格式,也就是:
{username=wordsmith&email=wordsmith%40some.where}
一旦转成物件并指定给user之后,其他的事情就和GET方法时操作的一样,写response的表头,将内容回传,并将user.username和user.email代入到内容中。
Step 3-app.js up and run
接下来的部分就简单了。
1)将app.coffee编译成app.js
coffee -c app.coffee
2)执行app.js
node app.js
3.用Signup表单发送username和email的资料
4.收到完事的回应。
收工。
好了,用POST传送资料就介绍到这里了,下一篇我们将用Ajax的方式来传送资料。
延伸阅读
1.node.js的http module说明:
http://nodejs.org/docs/latest/api/http.html
2.node.js的url module说明:
http://nodejs.org/docs/latest/api/url.html
3.node.js的querystring module说明:
http://nodejs.org/docs/latest/api/querystring.html
4.The Little Book on CoffeeScript
http://arcturo.github.com/library/coffeescript/
5.Node入门(中文)
http://www.nodebeginner.org/index-zh-tw.html
附录:
编译后的app.js
(function() { var http, qs, server, url; http = require('http'); url = require('url'); qs = require('querystring'); server = http.createServer(function(req, res) { var action, formData, urlData; urlData = url.parse(req.url, true); action = urlData.pathname; res.writeHead(200, { "Content-Type": "text/html" }); if (action === "/Signup") { formData = ''; req.on("data", function(data) { return formData += data; }); return req.on("end", function() { var user; user = qs.parse(formData); res.writeHead(200, { "Content-Type": "text/html" }); return res.end("<h1>" + user.username + "欢迎您的加入</h1><p>我们已经将会员启用信寄至" + user.email + "</p>"); }); } else { return res.end("<h1>欢迎光临Node.js菜鸟笔记</h1>"); } }); server.listen(3000); console.log('Server跑起来了,现在时间是:' + new Date());}).call(this);