Node.jS初学者笔记(2)-用POST传送资料

这里我们将学习用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);

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章